Sed はパターンをコマンドに置き換えます。

Sed はパターンをコマンドに置き換えます。

提案この問題

文字列<number with commas>を置き換えたいとしましょう。<number>something, "10,000", something

数字は1,00010,000...などになります。

次のコマンドが利用可能であることを確認します。

echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"

動作しません。何も起こりません。

私の問題を引き起こすことは、私がただ使用した場合echo

echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"

パラメータはよく読み込まれますが(または)\\1にパイプすることはできないようです。sedgrep

これはどのくらい可能ですか?

答え1

コマンドが実行される前に、式の一部としてコマンド置換が拡張されsedます。sed

これは、シェルがコマンドを実行しようとしていることを意味します。

sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"

最初の実行

echo \\1 | sed 's/,//'

この出力は、\1出力文字列にカンマがないために発生しますecho

その後、シェルはこの文字列をコマンド置換位置に挿入して次のように生成します。

sed "s/\(\".*\"\)/\1/"

これは、シェルでトレースが有効になっているパイプラインを実行している場合でも明らかです。

$ set -x
$ echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
+ echo 'something, "10,000", something'
+ echo '\1'
+ sed s/,//
+ sed 's/\(".*"\)/\1/'
something, "10,000", something

2番目のパイプラインでも同じことが起こります(実行を除くsed 's/,//')。

$ set -x
$ echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"
+ echo 'something, "10,000", something'
+ echo '\1'
+ sed 's/\(".*"\)/\1/'
something, "10,000", something

結論は:はいいいえsedコマンド置換を使用して、正規表現に一致する部分文字列を処理し、内部で他のシェルコマンドを呼び出すことができます。コマンド置換は呼び出し前に処理されるためですsedsed編集スクリプトは呼び出し前に解析されますsed)。

sedさらに、その言語は他の編集/処理言語のように他のコマンドを呼び出すメカニズムを提供しません(たとえば、基本コマンドrとエディタのwコマンドはedそれを許可しますawk)。

答え2

sed 's/\([0-9]\),\([0-9]\)/\1\2/g'

この方法は、2つのカンマの間に少なくとも2つの数字がある場合にのみ機能します。

123,456,789 -> 123456789
12,34,56,78 -> 12345678
but
1,2,3,4,5,6 -> 12,34,56

関連情報