我的问题似乎很简单,但我发现转换为 sed 表达式非常困难。
我需要在文件中的某些标记之间“强调”名称。因此,如果该行有标记:
,=
我需要在这两个标记之间将“多字名称”转换为“多字名称”。
我知道在标记之间进行两步匹配然后用下划线全局替换空格是相当容易的,但是我找不到保留不匹配的行部分以写回文件的方法。
这可能对你有用(GNU sed、tr 和 bash):
sed 's/:[^=]*=/$(tr " " "_" <<<"&")/g;s/.*/echo "&"/e' file
或仅使用 sed:
sed ':a;/:[^_=]*=/!b;s//\n&\n/;h;s/.*\n\(.*\)\n.*/\1/;y/ /_/;H;g;s/\n.*\n\(.*\)\n\(.*\)/\2\1/;ta' file
你可以通过两次调用来做到这一点sed
:
echo 'pre with space :multi word name=post with space' \
| sed 's/[:=]/\n&/g' | sed '/^:/s/ /_/g' | tr -d '\n'
要在文件上执行此操作,您可以执行以下操作(在 bash 中):
while read; do
echo "$REPLY" | sed 's/[:=]/\n&/g' | sed '/^:/s/ /_/g' | tr -d '\n'
echo
done < infile
虽然awk
将是更适合该任务的工具:
awk -F '[:=]' '{ gsub(" ", "_", $2); print $1 ":" $2 "=" $3 }' infile