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というファイルがあります。o
r
d
grep
r
d
grep [myword]
grep d r
fish
[...]
はい返品正規表現の特殊演算子([...]
glob演算子とよく似ています)は、、、、、またはをgrep '[myword]'
含む行と一致します。したがって、for(正規表現)の先頭もエスケープする必要があります。これはまたはで行うことができます。m
y
w
o
r
d
[
grep
grep '\[myword]'
grep '[[]myword]'
^
別の正規表現演算子です。つまり、行の先頭でのみ一致します。したがって、grep '^\[myword]: '
で始まる行と一致します[myword]:
。
一致する行だけgrep
を印刷するために(stream editorなどのストリームエディタではないsed
)、GNUは行の一致する部分(空でない場合)を印刷するgrep
非標準オプションを追加しました。-o
また、-P
noneの代わりにPerl互換正規表現(PCREで)を使用するオプションも追加します-P
。
最近のPCREでは、\K
演算子初期化一致セクションの先頭です。だからgrep -Po '^\[one]: \K.*'
我々は一致部分を印刷します-o
。なぜなら、一致部分は\K
後に見つかった文字のシーケンスになるからです( )。.*
[one]: