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表达式非常困难 我需要在文件中的某些标记之间加下划线。因此,如果行中有标记:和=,我需要将这两个标记之间的“多单词名称”转换为“多单词名称” 我知道在标记之间进行两步匹配,然后用下划线全局替换空格是相当容易的,但我找不到一种方法来保留行中不匹配的部分,以便写回文件。您可以通过两次调用sed: echo 'pre with space :multi word name=post with space' \ | sed 's/[:=]/\n&/g' |

我的问题似乎很简单,但我发现转换为sed表达式非常困难

我需要在文件中的某些标记之间加下划线。因此,如果行中有标记
=
,我需要将这两个标记之间的“多单词名称”转换为“多单词名称”


我知道在标记之间进行两步匹配,然后用下划线全局替换空格是相当容易的,但我找不到一种方法来保留行中不匹配的部分,以便写回文件。

您可以通过两次调用
sed

echo 'pre with space :multi word name=post with space' \
| sed 's/[:=]/\n&/g' | sed '/^:/s/ /_/g' | tr -d '\n'
要在文件上执行此操作,您可以执行以下操作(在bash中):


您可以通过两次调用
sed

echo 'pre with space :multi word name=post with space' \
| sed 's/[:=]/\n&/g' | sed '/^:/s/ /_/g' | tr -d '\n'
要在文件上执行此操作,您可以执行以下操作(在bash中):

这可能适合您(GNU-sed、tr和bash):

这可能适合您(GNU-sed、tr和bash):


行是否可以包含多对
=
令牌?行是否可以包含多对
=
令牌?“仅使用sed”仅使用sed
awk -F '[:=]' '{ gsub(" ", "_", $2); print $1 ":" $2 "=" $3 }' infile
sed 's/:[^=]*=/$(tr " " "_" <<<"&")/g;s/.*/echo "&"/e' file
sed ':a;/:[^_=]*=/!b;s//\n&\n/;h;s/.*\n\(.*\)\n.*/\1/;y/ /_/;H;g;s/\n.*\n\(.*\)\n\(.*\)/\2\1/;ta' file