シェルスクリプトは、単一行または複数行の開始および終了パラメータに基づいて行出力を印刷します。

シェルスクリプトは、単一行または複数行の開始および終了パラメータに基づいて行出力を印刷します。

私のファイルは次のとおりです

"abc"..,,xyz 123 "New york".."END" <- # Print this entire line as starts with " and ends with "END"
"mnh".....blahblah                 <- # dont print this line and hold til "END" is
"rew"..?/.."1324.75 United            # found and once it is found, merge multi-
 States"??..."END"                    # lines to single line without changes

希望の出力:

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah"rew"..?/.."1324.75 United States"??..."END"    

sedすべてのタスクを実行するために、次を見つけました。スタートモード"終了モードasで始まりますが、ここで"END"中間行が始まると破棄されます。""rew"終了モード見つけることができます。

sed -n '/^"/,/^"END"/{
        //!{H;/{x;s/\n\([^\n]*\)$/\1/;x}};
        /^"/{h};/"END"/{x;p};d
        }' file

関連:2つのパターン間の各レコードのデータ間で改行をどのように削除できますか?

ベストアンサー1

awk -v RS='"END"\n' -v FS='\n' -v ORS='"END"\n' -v OFS=' ' '{ $1=$1 };1' file

またはそれに対応する

awk 'BEGIN { ORS=RS="\"END\"\n"; FS="\n" } { $1 = $1 }; 1' file

OFS=' '(とにかく基本的な事実を使います)。

これは本当に短い awk1 つのレコードおよびフィールド区切り文字セットの入力形式を別のセットに単純に再指定するコマンドです。最も驚くべきことは、入力レコードとフィールド区切り文字(およびRSFSを新しい出力区切り文字(およびORSOFSに変更する方法です。

入力文書、

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah
"rew"..?/.."1324.75 United
States"??..."END"

"END"\nレコード区切り文字として使用され\n(改行)はフィールド区切り文字として使用されます。

フィールド区切り文字を (スペース)に変更すると、問題が解決します。

実際にパスワード古いフィールド区切り記号()の代わりに新しいフィールド区切り文字()が使用さawkれるようにレコード様式を再指定してください。OFSFS

結果は次のとおりです。

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah "rew"..?/.."1324.75 United States"??..."END"

技術的に複数文字の値でRS呼び出す指定されていない行動の基礎awkユーティリティのPOSIX仕様。ほとんどの(すべて?)現在awkの実装では、複数文字の値をRS正規表現として扱います。

おすすめ記事