Regex 如何替换sed中匹配字符串中出现的所有字符
我想替换sed中匹配字符串中出现的所有字符,例如、。匹配的字符串如下所示:Regex 如何替换sed中匹配字符串中出现的所有字符,regex,sed,Regex,Sed,我想替换sed中匹配字符串中出现的所有字符,例如、。匹配的字符串如下所示: [cite!abc,cde] 我想将其替换为: [!cite](abc, cde) 替换外部格式的命令是: sed 's/\[cite\!\([^]]+\)\]/\[\!cite\]\(\1\)/g' file 给 [!cite](abc,cde) 但是,我想在后面加空格,可能有任意数字或逗号分隔的条目,例如 [cite!abc,cde,def,fgh] 在sed中是否有一种优雅的方法来实现这一点,或者我是否需
[cite!abc,cde]
我想将其替换为:
[!cite](abc, cde)
替换外部格式的命令是:
sed 's/\[cite\!\([^]]+\)\]/\[\!cite\]\(\1\)/g' file
给
[!cite](abc,cde)
但是,我想在后面加空格,可能有任意数字或逗号分隔的条目,例如
[cite!abc,cde,def,fgh]
在sed中是否有一种优雅的方法来实现这一点,或者我是否需要使用perl脚本?如果保证输入字符串中逗号后没有空格:
sed 's/,/, /g' file
如果在输入字符串中逗号后有空格,则在输出字符串中会有额外的空格
编辑:
如果某些元素中的逗号后可能有空格,可以通过以下方式避免添加更多空格:
sed 's/,\([^ ]\)/, \1/g' file
这可能适用于GNU sed:
sed -E ':a;/\[([^]!]+)!([^]]+)\]/{s//\n[!\1](\2)\n/;h;s/,/, /g;H;g;s/\n.*\n(.*)\n.*\n(.*)\n.*/\2\1/;ta}' file
解决方案分为两部分:
将标识要修改的字符串,并将第一次传递重新排列为所需格式(不包括逗号分隔的列表)。
字符串被换行符包围,并将副本复制到保留空间中。然后,将当前模式空间中的所有逗号空间分隔开,并将副本和当前行连接起来,并使用模式匹配将其格式化为最终所需状态。
然后在当前行上重复该过程,以实现全局替换。这是可行的,但我不想干扰匹配空间之外的文本,因为它有其他标记,可以在字符串中包含“,”。这是一种强大的技巧!仍在试图找出H;G
sed -E ':a;/\[([^]!]+)!([^]]+)\]/{s//\n[!\1](\2)\n/;h;s/,/, /g;H;g;s/\n.*\n(.*)\n.*\n(.*)\n.*/\2\1/;ta}' file