两个令牌之间的 SED 中的全局转换



我的问题似乎很简单,但我发现转换为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

最新更新