次のファイル例があります。
some text is here
sometext(1,21);
sometext(2,9);
sometext(3,231);
sometext(10,1112);
sometext(11,17)
Some text is here
括弧内に2番目の数字を含む行を抽出しようとしているので、上記のsometext
例では数字は21
、、、、、です。9
231
1112
17
grep
上記のパターンに合ったコマンドが見つかりませんでした。
答え1
GNUを使用している場合は、grep
REを使用してコンマの後の数字を一致させることができます。
grep -oP ',\K\d+' file
ネイティブにperl
該当する内容は次のとおりです。
perl -lne 'print for /,\K\d+/g' file
答え2
このgrep
ユーティリティは、少なくとも標準のUnixツールを使用したい場合は、行の一部を抽出するのには適していません。標準grep
ユーティリティはパターンに一致するライン全体をフィルタリングしますが、部分ラインを抽出する自然な方法はありません。より詳細な方法で線を操作するには、たとえばを使用できますsed
。
テキストが表示されているものより長くて多様であると仮定すると、テキスト文字列を介してsometext(
2番目の整数値で行を処理するタイミングを伝えることができます。データ内の対応する文字列をチェックすると、2番目の整数の前後の横のビットを切り取ることができます。
ここでは、2つのトリム置換を適用します。 1つは行の先頭から行の最後のカンマまで、もう1つは閉じ括弧から行の終わりまで適用します。各行のデフォルト印刷をオフにし、-n
2 番目の置換後に結果文字列を明示的に印刷します。
sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file
また、特殊トリガー文字列と一致しない行を削除し、残りの行に両方の代替項目を適用するオプションもあります。
sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file
結果のリストをカンマ区切りのリスト(質問に示されているように)にしたい場合は、上記のコマンドの結果をパイプすることを検討してください。
paste -d, -s -
あなたの質問に関するデータに基づいて、私たちは次のようになります。
$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17
答え3
これには、フィールド区切り文字としてカンマまたは閉じawk
括弧()を使用します。これにより、-F'[,)]'
フィールド2()$2
に希望の数字が生成されます。これを$2に数字のみが含まれている小切手と組み合わせます。
$ awk -F'[,)]' '$2 ~ /^[[:digit:]]+$/ {print $2}' input.txt
21
9
231
1112
17
これは、$ 2に負以外の整数のみが含まれていると仮定します。負の数および/または間違いが含まれる可能性がある場合は、代わりに次を使用してください。
awk -F'[,)]' '$2 ~ /^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/ {print $2}' input.txt
注:awkはカンマをフィールド区切り文字として使用するため、カンマを小数点区切り文字として使用するロケールでは機能しません。
答え4
重い操作を実行するために使用することができ、カンマを望まないと仮定してクリーンアップにgrep
使用できます。tr
また、投稿から出力をどのようにレンダリングするかは不明であり、改行で区切られた数値のリストが生成されます。
grep -Eo ",[[:digit:]]+" input.txt | tr -d ","
または唯一の解決策tr
として使用しないでください。grep
grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"