私のファイルは次のとおりです
"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
答え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=' '
(とにかく基本的な事実を使います)。
これは本当に短い awk
1 つのレコードおよびフィールド区切り文字セットの入力形式を別のセットに単純に再指定するコマンドです。最も驚くべきことは、入力レコードとフィールド区切り文字(およびRS
)FS
を新しい出力区切り文字(およびORS
)OFS
に変更する方法です。
入力文書、
"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah
"rew"..?/.."1324.75 United
States"??..."END"
"END"\n
レコード区切り文字として使用され\n
(改行)はフィールド区切り文字として使用されます。
フィールド区切り文字を(スペース)に変更すると、問題が解決します。
実際にパスワード古いフィールド区切り記号()の代わりに新しいフィールド区切り文字()が使用さawk
れるようにレコード様式を再指定してください。OFS
FS
結果は次のとおりです。
"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah "rew"..?/.."1324.75 United States"??..."END"
技術的に複数文字の値でRS
呼び出す指定されていない行動の基礎awk
ユーティリティのPOSIX仕様。ほとんどの(すべて?)現在awk
の実装では、複数文字の値をRS
正規表現として扱います。
答え2
行がsedで終わらない場合は、"END"
次のように次の行に接続できます。
sed -e :a -e '/"END"$/!N; s/\n//; ta' file
前任者。次file
のように与えられる
"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah
"rew"..?/.."1324.75 United
States"??..."END"
それから
$ sed -e :a -e '/"END"$/!N; s/\n//; ta' file
"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah"rew"..?/.."1324.75 UnitedStates"??..."END"
(希望する出力と一致)これいいえリンク時に改行文字を置き換えるスペースを追加します。スペースが必要な場合は、次のようs/\n//
に変更してください。s/\n/ /