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]+

答え2

これを行うためには使用できませんcut

  1. tr -c -d '0123456789\012'
  2. sed 's/[^0-9]*//g'
  3. awk -F'[^0-9]+' '{ print $1$2$3 }'
  4. grep -o -E '[0-9]+'

tr問題に最も適しており、おそらく最も速く実行されます。しかし、速度の観点からこれらのオプションを区別するには、多くの入力が必要になると思います。

答え3

数字以外の文字の間で連続した数字の集合を抽出することを意味する場合、これは最善のようです(一致する文字も提供できますがsed)。awkgrep

sed:もちろん、数字を一致させることもできますが、逆に数字以外の項目を削除するのも面白いかもしれません(1行に数字が1つしかない場合)。

$ echo nn3334nn | sed -e 's/[^[[:digit:]]]*//g'
3344

grep:連続した数字と一致することがあります

$ echo nn3334nn | grep -o '[[:digit:]]*'
3344

awk私はこれについての経験がないので、例を提供しません。興味深いのはsedスイスの剣ですが、grepこれを行う方が簡単で読みやすい方法を提供し、各入力に対して複数の数字でも機能することです。 line(-o入力の一致する部分をそれぞれ1行に一意に印刷します):

$ echo dna42dna54dna | grep -o '[[:digit:]]*'
42
54

答え4

何人かの人々はこれが不可能だと言うのでcut、私がそれを「最高」として使用することを支持しなくてもcut(またはさらには特に良い)解決策です。数字*[とその周りの数字を具体的に見つけることができない解決策は仮定を]*単純化するので、質問者が提供したものよりも複雑な例(*[数字の外側には]*表示されない)で簡単に失敗します。 )。このソリューションは、少なくとも括弧を確認し、アスタリスクを確認するように拡張することもできます(読者の練習用に残しました)。

cut -f 2 -d '[' myfile.txt | cut -f 1 -d ']'

これは-d区切り文字を指定するオプションを利用します。もちろん、cutファイルから読み込むのではなく、式をパイプで連結することもできます。かなり高速ですが、cut単純なので(正規表現エンジンなし)、少なくとも2回(または確認するにはそれ以上)呼び出す必要があります。*これにより、わずかなプロセスオーバーヘッドが発生します。この解決策の本当の利点は、特に正規表現の構文に慣れていない一般ユーザーにとっては、読み取りがかなり簡単であることです。

関連情報