Sed:查找,替换然后将结果附加到原始行中

问题描述 投票:0回答:1

我在Mac上,我想在行中找到一个模式,将其替换为某些内容,然后将结果字符串附加到原始行的末尾。这是我尝试过的:

echo "test='123'" | sed -E  '/([^a-z])/ s/$/ \1/' 

sed: 1: "/([^a-z])/ s/$/ \1/": \1 not defined in the RE

我需要定义\1?我以为我用了([^a-z])。否?

编辑:也许这段代码可以更好地代表我想要的内容:

1)echo "test='123'" | sed 's/[a-zA-Z0-9]//g'

2)我想要新行=原始行+上面的#1行

换句话说:

之前(我得到的是:test='123'

之后(我想要的是:test='123' =''

sed replace append
1个回答
0
投票

您可以通过以下方式编辑此命令:

echo "test='123'" | sed -E 'h;s/([a-zA-Z0-9])//g;G;s/(.*)\n(.*)/\2\1/'

出于可读性考虑,脚本逐行读取

h
s/([a-zA-Z0-9])//g
G
s/(.*)\n(.*)/\2\1/
  • [h将当前行存储在保留空间中,
  • 您的s命令执行的操作
  • [G将保留空间的内容(即原始行)附加到模式空间(即您编辑时的当前行),并在其间插入换行符\n
  • 另一个s命令重新排列了两个部分,也删除了\n命令插入的G

评论

  • 您的原始尝试sed -E '/([^a-z])/ s/$/ \1/'无法工作,因为\1指的是最左边的(…)组所捕获的内容s命令的搜索部分中,它不会“记住”该组(s)您以前用于该行的地址。
  • 一旦使用p打印图案空间,就会附带换行符,并且一旦打印,就无法在同一sed程序中将其删除。
© www.soinside.com 2019 - 2024. All rights reserved.