1

sedファイルの内容を次のように連結するために使用しています。

    cat source.c |  sed -e :a -e '$!N; s/\n/ /; ta'

このファイルには、パイプで区切られた関連情報 [一連の文字列] が含まれています|IFSをパイプに変更|し、新しいものにパイプすることで出力を取得しIFS、新しい形式のファイルを標準出力に表示したい。

連結後の source.c のインスタンス:

    void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***) 

を設定することで達成したいことIFS

    void f0 (***)
    void f1 (***)
    void f2 (***)
    void f3 (***) 

事前に返信ありがとうございます。ファイルで可能かどうかはわかりません。ここで変数や配列を使用したくありません。

EDIT:ソースファイルは最初に次のように表示されます:

    void 
          f0 
         (***) |
    void 
               f1
                              (***) |
                   void                   f2                    (***) |
    void             f3                                                (***)   

したがって、最初に連結し、次に各単語グループのスペースを 2 倍にしてから、区切り記号としてパイプを使用して分割します。

sed -e :a -e '$!N; s/\n/ /; ta' source.c | sed -e 's/  */  /g' -e 's/ *//'

sedand のawk代替は、仕事を完璧に行います。

最初の編集時の賛成票に基づいて選択された回答:) . 回答の1つで示唆されているように、他の人がIFS.

4

4 に答える 4

3

それがまさにあなたが望むものである場合は、「|」を置き換えるだけです 改行付き。

echo 'void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***) ' | sed 's, *| *,\n,g'

またはあなたのコマンドで:

sed -e :a -e '$!N; s/\n/ /; ta' source.c | sed 's, *| *,\n,g'

シェルの IFS をいじると、非常にあいまいな問題が発生する可能性があります。ただし、awkをいじることは問題ではありません。

echo 'void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***) ' | awk 'BEGIN {RS="|";} { print $0}'
sed -e :a -e '$!N; s/\n/ /; ta' source.c | awk 'BEGIN {RS="|";} { print $0}'
于 2012-07-02T12:52:01.013 に答える
3
$ cat source.c | awk 'BEGIN{ RS="|" } {$1=$1; print $0}'

連結された出力をこのawkスクリプトにパイプすると、パイプ区切りが改行に変更されます。


$ cat test
void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***)

$ cat test | awk 'BEGIN{ RS="|" } {$1=$1; print $0}'
void f0 (***)
void f1 (***)
void f2 (***)
void f3 (***)
于 2012-07-02T12:55:52.637 に答える
1
your_pipeline | awk 'BEGIN{RS="\\| |\n";ORS="\n"}1'

入力レコード区切り記号は、スペースまたは改行が続くリテラル パイプです。出力レコード区切りは改行です。印刷される原因となる「1真」です。$0

于 2012-07-02T15:41:00.523 に答える
0

なぜあなたはこれのために sed/awk を気にしているのですか? 質問を正しく読んだら、すべての改行を削除して、すべて改行に置き換えて|ください。

tr -d \\n | tr \| \\n

入力ファイルが で終わらない場合|、これは終了改行を出力しません。その場合、全体的なコマンドは次のようになります。

 < source.c tr -d \\n | tr \| \\n; echo
于 2012-07-03T13:33:46.503 に答える