0

私の問題は単純なようですが、sed式に変換するのは驚くほど難しいことがわかりました。

ファイル内の特定のトークン間で名前を「アンダースコア」する必要があります。したがって、行にトークンが:あり=、これら2つのトークン間で「multiwordname」を「multi_word_name」に変換する必要がある場合。

トークン間で2つのステップを一致させてから、スペースをアンダースコアでグローバルに置き換えるのはかなり簡単ですが、ファイルに書き戻すために行の一致しない部分を保持する方法が見つかりません。

4

2 に答える 2

3

これはあなたのために働くかもしれません(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
于 2012-09-24T10:04:15.310 に答える
2

の2つの呼び出しでそれを行うことができます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
于 2012-09-24T09:37:18.607 に答える