提案この問題。
文字列<number with commas>
を置き換えたいとしましょう。<number>
something, "10,000", something
数字は1,000
、10,000
...などになります。
次のコマンドが利用可能であることを確認します。
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
動作しません。何も起こりません。
私の問題を引き起こすことは、私がただ使用した場合echo
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"
パラメータはよく読み込まれますが(または)\\1
にパイプすることはできないようです。sed
grep
これはどのくらい可能ですか?
答え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
コマンド置換を使用して、正規表現に一致する部分文字列を処理し、内部で他のシェルコマンドを呼び出すことができます。コマンド置換は呼び出し前に処理されるためですsed
(sed
編集スクリプトは呼び出し前に解析されます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