最初の一致まで削除し、その行を編集し、残りの行をそのまま印刷します。

最初の一致まで削除し、その行を編集し、残りの行をそのまま印刷します。

次のテキストがあります。

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 -または他のパターンに置き換えます)。

おすすめ記事