たとえば、次のようになります。
$ 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つのサブ式が生成されます。
- 先行スペース:
^\([[:space:]]*\)
- 「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
\s
BRE の一部ではなく使用されsed
ます。 BREの\s
テキストと同じですs
。同等です。以下を試して\s
ください[[:space:]]
sed -i 's/^[[:space:]]*bucket/(bucket/g' test001.txt