Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何替换sed中匹配字符串中出现的所有字符_Regex_Sed - Fatal编程技术网

Regex 如何替换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中是否有一种优雅的方法来实现这一点,或者我是否需

我想替换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