web-dev-qa-db-ja.com

sedで一致したパターンの一部のみを置き換える

同じ構造の何万もの行について、私はここから(例えば)行きたいです:

abcd 12345 qwerty asdfg

...ここまで:

abcd 12345,qwerty asdfg

...と

sed 's/[0-9]\ [A-Z]/,/g'

右のスペースとその周囲の両方の文字(5 q)を一致させることができますが、代わりに(明らかに)次のようになります。

abcd 1234,werty asdfg

また、私はこれをLinuxシェルで実行したい

数字が前にあり、アルファベットが続くスペースだけをすべての行で一致させて置き換えるにはどうすればよいですか?これを行う代わりに、別のツール(またはアプローチ)を提案していただけますか?

4
geojunkieSCI

試してください:

$ echo 'abcd 12345 qwerty asdfg' | sed -E 's/([[:digit:]]) ([[:alpha:]])/\1,\2/g'
abcd 12345,qwerty asdfg

ノート:

  1. 拡張正規表現構文を取得するために-Eを追加しました。

  2. [:digit:][:alpha:]は、Unicodeで安全にするために、0-9A-Zの代わりに使用されます。

  3. 親はグループを作成するために使用され、置換テキストで参照できます。この場合、\1は数字を参照し、\2は文字を参照します。

4
John1024