sed - 特定の単語で始まり、別の単語で終わる行を変更しますか?

sed - 特定の単語で始まり、別の単語で終わる行を変更しますか?

たとえば、次のようになります。

$ cat test001.txt
this
is a
 test bucket
bucket line not this one.
  bucket lein endy
    bucket and others endy
and
a ttest

スペースを無視して「bucket」で始まる行を「(bucket」に変更するにはどうすればよいですか?

これまで私は以下を持っています:

sed -i 's/^\sbucket/bucket(/g' test001.txt    

ただし、これは機能しません(変更とエラーはありません)。次に、次の行に対してこれを行いたいと思います。返品「endy」で終わります(したがって、3つのバケット行のうち2つのみ)。

ベストアンサー1

\1代替用語には逆参照(例:)を使用できます。これは\(…\)検索語のサブ式を置き換えます(角かっこ - 内のものは除く)。例えば、

$ cat test001.txt | sed -e 's/^\([[:space:]]*\)\(bucket.*endy\)$/\1(\2/'
this
is a
 test bucket
bucket line not this one.
  (bucket lein endy
    (bucket and others endy
and
a ttest

2つのサブ式が生成されます。

  1. 先行スペース:^\([[:space:]]*\)
  2. 「bucket」で始まり、「endy」で終わる文字列(EOLで):\(bucket.*endy\)$

\1(\2次に、空白、開き括弧、最後にbucket..endy文字列に一致するすべての行を置き換えます。

おすすめ記事