sed のマニュアルには、代替の置換文字列に使用できる後方参照には、\1 から \9 までの番号が付けられていることが明確に記載されています。10 個のフィールドを持つログ ファイルを解析しようとしています。
そのための正規表現を作成しましたが、10 番目の一致 (およびそれ以降) にはアクセスできません。
KSH (またはおそらくシェルスクリプトに移植できる言語) でこの制限を回避するエレガントな方法はありますか?
sed のマニュアルには、代替の置換文字列に使用できる後方参照には、\1 から \9 までの番号が付けられていることが明確に記載されています。10 個のフィールドを持つログ ファイルを解析しようとしています。
そのための正規表現を作成しましたが、10 番目の一致 (およびそれ以降) にはアクセスできません。
KSH (またはおそらくシェルスクリプトに移植できる言語) でこの制限を回避するエレガントな方法はありますか?
perl -pe 's/(match)(str)/$2$1/g;'
sed の代わりに使用できますか? 後方参照の制限を回避する方法は、sed 以外のものを使用することです。
また、置換は 2 段階で行うことができると思いますが、パターンがわからないため、その方法についてはお答えできません。
置き換えられた要素が、それらを分割したグループ内にある限り、ストリームを -e で分割します。日時を 14 桁の文字列に再編成できるように日付分割を行ったとき、ストリームを 3 回分割する必要がありました。
echo "created: 02/05/2013 16:14:49" | sed -e 's/^\([[:alpha:]]*: \)//' -e 's/\([0-9]\{2\}\)\(\/\)\([0-9]\{2\}\)\(\/\)\([0-9]\{4\}\)\( \)/\5\1\3/' -e 's/\([0-9]\{2\}\)\(\:\)\([0-9]\{2\}\)\(\:\)\([0-9]\{2\}\)/\1\3\5/'
20130205161449
あなたはシェル スクリプト ソリューションを求めています。つまり、sed だけを使用することに限定されていないということですよね?ほとんどのシェルは配列をサポートしているので、おそらく行をシェル配列変数に解析できますか? 必要に応じて、同じ行を複数回解析して、パスごとに異なる情報を抽出することもできます。
それでいいの?
正規表現の後方参照を使用する必要のないソリューションを検討してください。たとえば、単純なフィールド区切り文字がある場合はsplit
、perl の代わりに を使用するか、処理に awk を使用することさえできます。