我的问题似乎很简单,但我发现转换为sed表达式非常困难。
我需要在文件中的某些标记之间"低估"名称。因此,如果该行有:
和=
的标记,我需要在这两个标记之间将"多词名称"转换为"multi_word_name"。
我知道在令牌之间进行两步匹配,然后用下划线全局替换空格是相当容易的,但我找不到一种方法来保留不匹配的行部分以写回文件。
这可能
对你有用(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(.*)/21/;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