2つの特定の文字または文字列の間でテキストを検索する

2つの特定の文字または文字列の間でテキストを検索する

次のような行があるとしましょう。

*[234]*
*[23]*
*[1453]*

これは*すべての文字列を表します(形式の文字列を除く[number])。コマンドラインユーティリティを使用してこれらの行を解析し、角かっこの間の数を抽出するにはどうすればよいですか?

より一般的には、次のツールのうちcutsedまたは ?grepawk

ベストアンサー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]+

おすすめ記事