周囲にスペースがないコロンを見つけたら、コロンの前後にスペースを入れるsedコマンドを作成しようとしています。つまり、次のようにabc:def
変換しますabc : def
。
echo "abc:def" | sed -e 's/[^\s]\+:[^\s]\+/ : /g'
出力はまだですabc:def
。どうすればいいですか?上記のコマンドにはどのような問題がありますか?
答え1
\s
空白表現sed
は移植可能ではありません。たとえば、POSIX実装では式が一致しません(GNU sed、posixモード)。
$ echo "abc:def" | sed --posix -e 's/[^\s]\+:[^\s]\+/ : /g'
abc:def
しかし、あなたの表情ならした一致すると、シーケンス全体を置き換えるため、目的の操作は実行されません(たとえば、非posixモードのGNU sed)。
$ echo "abc:def" | sed -e 's/[^\s]\+:[^\s]\+/ : /g'
:
おそらくあなたが望むものはs/\([^[:blank:]]\):\([^[:blank:]]\)/\1 : \2/
例えば
$ echo "abc:def" | sed -e 's/\([^[:blank:]]\):\([^[:blank:]]\)/\1 : \2/g'
abc : def
[私の知る限り、\+
移植性のない反復演算子は不要です。 ]
答え2
努力する:
echo "abc:def" | sed 's@\([^\s]\):\([^\s]\)@\1 : \2@g'
私はこれをGNU sedでテストしましたが、これがBSD sedの場合であるかどうかはわかりません。
元の一致の一部を維持するには、現在実行中のアクションであるキャプチャグループが\(...\)
必要\1
です\2
。また、+
最も近い隣人にのみ興味があるため、修飾子は必要ありません。