使用 sed 将匹配模式的行复制到另一个匹配模式行的旁边

使用 sed 将匹配模式的行复制到另一个匹配模式行的旁边

我想将包含的行复制www.website.com到包含 的行中thetext

例如,我想转换这个输入:

Lorem ipsum dolor sit amet, elit.
Cras eu www.website.com velit vitae
Pellentesque interdum
thetext
Sed ullamcorper tellus

进入这个输出:

Lorem ipsum dolor sit amet, elit.
Cras eu www.website.com velit vitae
Pellentesque interdum
thetextCras eu www.website.com velit vitae
Sed ullamcorper tellus

我不知道如何使用复制粘贴sed。看起来有些棘手。

答案1

您还可以使用ed(此处在Bashshell 中使用)来移动和连接线,如下所示:

str='
Lorem ipsum dolor sit amet, elit.
Cras eu www.website.com velit vitae
Pellentesque interdum
thetext
Sed ullamcorper tellus
'

# cf. http://wiki.bash-hackers.org/howto/edit-ed
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$str")
   H
   /www\.website\.com/m/thetext/
   -1,.j
  ,p
  q
EOF

如果您要就地编辑文件,这ed可能是您的首选工具。

答案2

我不确定这是否正是您想要的,但是:

  1. 当您看到感兴趣的行(包含 的行www.website.com)时,将其复制到保留空间中。
  2. 当您看到要替换的文本 ( thetext) 时,追加保留空间的内容,然后
  3. 清理结果。
sed -e '/www\.website\.com/h' \
    -e '/thetext/{' -e 'G' -e 's/\n//' -e '}'

我确实建议转向 awk 来处理普通 之外的任何事情s///

awk '
    /www\.website\.com/ { line=$0 }
    /thetext/ { $0 = $0 line }
    1'

相关内容