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文字列に一致するすべての行を置き換えます。

答え2

別のアプローチは次のとおりです。

sed -e '/^[[:space:]]*bucket.*endy$/s/bucket/(bucket/' file.txt

最初の内容は/pattern/sedにthatを含む行でのみ機能するように指示し、pattern残りは単純な標準置換です。

答え3

\sBRE の一部ではなく使用されsedます。 BREの\sテキストと同じですs。同等です。以下を試して\sください[[:space:]]

sed -i 's/^[[:space:]]*bucket/(bucket/g' test001.txt

関連情報