【问题标题】:Sed: find, replace and then append result to original lineSed:查找,替换然后将结果附加到原始行
【发布时间】:2020-07-31 13:14:42
【问题描述】:

我在 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 -E '/\([^a-zA-Z=][^a-zA-Z=]*\)/ s/$/ &/'?不确定行匹配中的\(--grouping operator--\) 是否会延续到s/regex/repl/ 部分。我会将\( \) 移动到s/regex/repl/ 部分。祝你好运。
  • 对不起,我显然不清楚。我需要在该行中找到一个字符串并将其替换为某些内容(例如,用空格)。结果将是新字符串。但随后我需要将此新字符串附加到原始行。我可能需要编辑我的初始代码以使其更清晰。
  • 口头描述通常是模棱两可的。最好完全按照您的需要显示beforeafter(带有示例数据)。祝你好运。
  • 添加了beforeafter
  • echo "test='123'" | sed "s/$/ =''/g" 产生您请求的输出。是的,在s 之前添加/test='123/ 将只编辑那些行,而所有其他行将不加更改地打印。祝你好运。

标签: sed replace append


【解决方案1】:

你可以这样编辑这个命令:

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 命令重新排序这两个部分,同时删除了G 命令插入的\n

评论

  • 您最初的尝试sed -E '/([^a-z])/ s/$/ \1/' 无法正常工作,因为\1 指的是最左边的(…)s 命令的搜索部分中捕获的内容,它没有“记住”您用来解决该线路的组。
  • 使用p 打印模式空间后,它会附带一个换行符,并且一旦打印,您就无法在同一个sed 程序中删除它。

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 2014-03-30
    • 2013-08-07
    • 2019-11-21
    • 1970-01-01
    • 2013-02-09
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多