sed

sed

無駄な情報が削除された巨大な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
================

おすすめ記事