範囲内の数字を含む文字列をフィルタリングして型を変更します。

範囲内の数字を含む文字列をフィルタリングして型を変更します。

次のパターン行を含むファイルがあります。

136x2340+1564+0

それは、<N1>x<N2>+<N3>+<N4>

からまでのgrepすべての行をフィルタリングしたいです(おそらく使用)。N1ab そして N2範囲はc〜ですd

定数はa,b,c,d私の問題によって異なります。スクリプトで修正します。

試しましたが、egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]+)'出力が表示されます。

136x2340+1564+0
835x428+355+1780
817x406+186+747
114x1533+1256+456

N2つまり、4桁の行も表示されます(3桁だけあるようです)。

編集する:また、(カンマ)、最初の記号を(スペース)、2番目の記号を(カンマ)にx置き換えたいので、出力は次のようになります。,++,

N1,N2 N3,N4

答え1

grep ERE (拡張正規表現) 構文で+「1 つ以上の先行原子」を意味する数量子です。このコンテキストでリテラル一致を実行するには、+エスケープする必要があります。

egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]\+)' file
835x428+355+1780
817x406+186+747

やりたいなら変えるgrep実際には正しいツールではありません。ただし、バージョンにsed同様の拡張正規表現パターンがある場合は、次のように使用できます。

sed -En 's/([0-9]{3})x([0-9]{3})\+([0-9]{1,})\+([0-9]{1,})/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

デフォルトの正規表現のみがある場合、エスケープを読み取るのが難しくなります。

sed -n 's/\([0-9]\{3\}\)x\([0-9]\{3\}\)+\([0-9]\{1,\}\)+\([0-9]\{1,\}\)/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

関連情報