次のテキストがあります。
add gmt version date
comment - text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue
「コメント」が最初に表示される部分からファイルの終わりまでのすべてのテキストが必要です。私はsed 's/^.*Comment - //g'
次のテキストだけを取得します。
text 3
text3 continue
つまり、最後に表示される「コメント」からファイルの終わりまでです。しかし、「コメント」が最初に現れる部分からテキストの終わりまでのすべてのテキストが必要です。
text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue
答え1
最も簡単な方法は、sed
コマンドごとにグループ化することです。
{ sed '/PATTERN/!d;s///;q'; cat; } <infile
一致しないすべての行を削除d
し、最初の一致でs
置換を実行し、要求に応じて終了(自動印刷)し、残りの行cat
(存在する場合)を引き継ぎ印刷します。これを一人で行う
ことはできませんsed
。
sed '/PATTERN/,$!d # delete all lines not in this range
//{ # if the line matches
x;//!{ # exchange and IF what was in hold space doesn't match
g;s///;b # get hold space content, replace, go to end of script
}
x # ELSE exchange back (do nothing)
}' <infile
私はPATTERN
それを単純に保つために使用します(^.*comment -
または他のパターンに置き換えます)。
答え2
配管したが状態が悪い
$ sed -n '/comment/,$ p' file | sed -r '0,/comment/ s/comment - (.*)/\1/'
text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue
説明する
sed -n '/comment/,$ p' file
comment
最初から最後まで行を印刷します。sed -r '0,/comment/ s/comment - (.*)/\1/'
最初の行を見つけてcomment
編集して削除します。comment -