次のパターン行を含むファイルがあります。
136x2340+1564+0
それは、<N1>x<N2>+<N3>+<N4>
。
からまでのgrep
すべての行をフィルタリングしたいです(おそらく使用)。N1
a
b
そして 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