次のような行があるとしましょう。
*[234]*
*[23]*
*[1453]*
これは*
すべての文字列を表します(形式の文字列を除く[number]
)。コマンドラインユーティリティを使用してこれらの行を解析し、角かっこの間の数を抽出するにはどうすればよいですか?
より一般的には、次のツールのうちcut
、sed
または ?grep
awk
ベストアンサー1
GNU grepがある場合は、その-o
オプションを使用して正規表現を検索し、一致する部分のみを出力できます。 (他の grep 実装では全行のみを表示できます。) 1 行に一致する項目が複数ある場合、別の行に印刷されます。
grep -o '\[[0-9]*\]'
括弧以外の数字のみを希望する場合は、幅0のアサーションを使用する必要があります。つまり、空の文字列と一致する正規表現ですが、前後に括弧がある場合にのみ適用されます。幅0のアサーションはPerl構文でのみ使用できます。
grep -P -o '(?<=\[)[0-9]*(?=\])'
sedを使用すると、印刷をオフにし、行-n
全体を一致させ、一致する部分のみを維持する必要があります。 1行に複数の一致がある場合は、最後の一致のみが印刷されます。バラより周辺文字を印刷せずに「sed」に一致する正規表現を抽出するsed の使用方法の詳細については、こちらをご覧ください。
sed -n 's/^.*\(\[[0-9]*\]\).*/\1/p'
または角かっこではなく数字だけを希望する場合:
sed -n 's/^.*\[\([0-9]*\)\].*/\1/p'
そうではなく、grep -o
簡単でわかりやすいものが必要な場合は、Perlが選択可能なツールです。各行(-n
)でその行に一致が含まれている場合は、対応する一致\[[0-9]*\]
($&
)と改行文字(-l
)を印刷します。
perl -l -ne '/\[[0-9]*\]/ and print $&'
数字だけを希望する場合は、正規表現に括弧を入れてグループを区切り、そのグループのみを印刷してください。
perl -l -ne '/\[([0-9]*)\]/ and print $1'
PS角かっこの間に1つ以上の数字しか必要でない場合は、Perlでまたは[0-9]*
に[0-9][0-9]*
変更します[0-9]+
。