我在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' =''
您可以通过以下方式编辑此命令:
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
程序中将其删除。