テキストファイルの行から1つの要素を抽出する

テキストファイルの行から1つの要素を抽出する

コマンドはgrep、行に式に一致する文字列が含まれている場合に行を出力しますが、指定されたコンテンツを検索するには便利ではありません。

例えば、私は書式付きの語彙ファイルを持っています

**word**
1. Definition:
2. Usage
3. Others

ファイル内の単語リストを作成するためにすべての単語を取得したい

grep '\*\*[^*]*\*\*'

コンテンツの大部分を返します。

grepだけをキャッチするにはどのように使用しますかword?

答え1

単語の場合は、次のようにします。正規表現(-P):

grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file

出力:

word

単語の場合は次のようになります:

grep -oP '^\s*\d+\.\s*\K\w+' file

出力:

Definition
Usage
Others

答え2

単語を抽出するために使用できるツールはいくつかありますが、以下は sed で実装されたバージョンです。

 sed '/^\*\*/!d' <your_file

このコマンドは、ファイル内の で始まるすべての行に一致し**、それを出力します。その他の行は出力から削除されます。星印も削除したい場合は、コマンドを次のように拡張できます。

sed '/^\*\*/!d;s/\*//g' <your_file

さらに、このコマンドは、*印刷される前に行からすべての文字を削除します。

答え3

方法awk

awk -F'*\\*' 'NF>2{print $2}' infile

サンプルテスト入力:

*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**

出力:

word

答え4

grep追加のツールを使用することに抵抗がない場合は、非常に簡単な解決策として、出力を後処理して、tr文字のすべての出現を削除することが考えられます*

grep -x '\*\*[^*]*\*\*' | tr -d '*'

-xまた、同じ行にある他のテキストに囲まれた部分を誤って検出しないように、上記のように GNU grep のフラグを使用して行全体のみに一致させることをお勧めします**word**。これにより、早い段階で多くの潜在的な一致を破棄できるため、パターン マッチング プロセスも高速化される可能性があります。

sed代替

sed のpフラグを利用して、一致、置換、印刷を 1 つのコマンドとして実行することもできます。

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'

関連情報