[単語]の後にのみテキストを入力してください。

[単語]の後にのみテキストを入力してください。

example.txt次のテキストを含むファイルがあります。

[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc

次のテキストだけをgrepして表示する必要があります[myword]。次の方法でテストしてみてください。

grep [myword] /tmp/example.txt | cut -d ':' -f 2

各項目について、[myword]括弧の後のすべての内容が印刷されます。しかし、全体の代わりに必要なものだけを得る方法は何ですか?

特定の括弧の後にテストを印刷するだけです。たとえば、行の後のテキストではなく行の[one]: 中のテキストだけを印刷してすべてを印刷するには、正しい出力は次のようになります。[two]:[onemore]:bla bla bla onebla twobla[onemore]:i got mad and etc

ベストアンサー1

より良い点は次のとおりですsed

sed -n 's/^\[one]: //p' < example.txt

grep最新のPCREをサポートするGNUを使用すると、次のこともできます。

grep -Po '^\[one]: \K.*' < example.txt

または

grep -xPo '\[one]: \K.*' < example.txt

とにかく、ほとんどのシェルでは[...]glob演算子であることに注意してください。 in では、grep [myword]その[myword]ファイルと一致するファイルのリストに展開されます。つまり、現在のディレクトリにm、、、、またはyという名前のファイルがない場合、パターンはそのまま渡されるか、w次のようにエラーが発生します。シェル) 。したがって、シェルはこれを引用する必要があります(たとえば、ソリューションに示されているように単一引用符を使用)。たとえば、現在のディレクトリにファイルがあり、というファイルがある場合は、Exceptというファイルがあります。ordgreprdgrep [myword]grep d rfish

[...]はい返品正規表現の特殊演算子([...]glob演算子とよく似ています)は、、、、、またはをgrep '[myword]'含む行と一致します。したがって、for(正規表現)の先頭もエスケープする必要があります。これはまたはで行うことができます。myword[grepgrep '\[myword]'grep '[[]myword]'

^別の正規表現演算子です。つまり、行の先頭でのみ一致します。したがって、grep '^\[myword]: 'で始まる行と一致します[myword]:

一致する行だけgrepを印刷するために(stream editorなどのストリームエディタではないsed)、GNUは行の一致する部分(空でない場合)を印刷するgrep非標準オプションを追加しました。-oまた、-Pnoneの代わりにPerl互換正規表現(PCREで)を使用するオプションも追加します-P

最近のPCREでは、\K演算子初期化一致セクションの先頭です。だからgrep -Po '^\[one]: \K.*'我々は一致部分を印刷します-o。なぜなら、一致部分は\K後に見つかった文字のシーケンスになるからです( )。.*[one]:

おすすめ記事