例如,给定:
$ 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
将创建两个子表达式:
- 前导空格:
^\([[: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