無駄な情報が削除された巨大なcvsログファイルがあり、内容は次のとおりです。
Working file: unmodifiedfile1.c
================
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: unmodifiedfile2.h
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
Working file: unmodifiedfile3.h
変更されていないファイルに関連する行を整理したいと思います。
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
似合うパターンは
Working file: FILENAME
================
これまで私ができたことは次のとおりです。
sed '/Working file:/ N ; s/\n/PLACEHOLDER/' changelog.txt |
grep -v 'PLACEHOLDER===' |
sed 's/PLACEHOLDER/\n/
しかし、よりクリーンな解決策があると確信しています。 sedの無知は私をブロックしています...
ポリスチレン
出力は次に終了します。
================
Working file: unmodifiedfile3.h
また許可
答え1
sed
これはあなたが求めているものに似ているはずです:
<cvslog sed -n '/Working file/ { N; /\n=\+$/b; :a; N; /\n=\+$/!ba; p; }'
出力:
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
説明する
以下はコメントを含む同じスクリプトですsed
。
/Working file/ {
N # append next line to pattern space
/\n=\+$/b # is it a file separator -> next file
:a
N # append next line to pattern space
/\n=\+$/!ba # isn't it a file separator -> read next line
p # otherwise print accumulated text
}
アッ
awk
ファイル区切り線をレコード区切り線()として使用するように指示すると、RS
合理的な選択基準を定義することが非常に簡単になります。
<cvslog awk 'NF>2' RS='\n=+\n' FS='\n' ORS='\n\n'
出力:
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
bashとcoreutils
楽しみとして:
csplit cvslog '/=\{16\}/1' '{*}'
wc -l xx* |
head -n-1 |
while read n f; do
if (( n > 2 )); then
cat $f
fi
done
出力:
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
答え2
sed '/Working file:/ N ; s/\n/PLACEHOLDER/' changelog.txt |
grep -v 'PLACEHOLDER===' |
sed 's/PLACEHOLDER/\n/
実際、次のように短縮できます。
$ sed '/Working file:/{N;/===/d}' changelog.txt
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
Working file: unmodifiedfile3.h
Working file:
次の行(含まれている場合)===
と最後の行(含まれている場合)を含むすべての行を削除します。Working file:
ご提案いただいた@ilkkachuに感謝します。パターンが行の先頭で一致する必要がある場合は、次を使用してください。^Working file:
$ cat ip.txt
Working file: 123
================
Working file: f1
----------------------------------
revision 1.3
Fixed some bug
================
Working file: abc
================
Working file: file
----------------------------------
revision 1.1
Added some feature
================
Working file: xyz
$ sed '/Working file:/{N;/===/d}' ip.txt | sed '${/Working file:/d}'
Working file: f1
----------------------------------
revision 1.3
Fixed some bug
================
Working file: file
----------------------------------
revision 1.1
Added some feature
================