コマンドは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'