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

将创建两个子表达式:

  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

\s不是 BRE 的一部分,它sed使用。在 BRE 中\s与文字相同s。相当于。\s[[:space:]]请尝试以下操作:

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

相关内容