特定の文字列の前のテキストの抽出

特定の文字列の前のテキストの抽出

1行に1単語ずつgrepしようとしています。各行について、grep単語の前に発生したすべての内容を印刷したいと思います。

例:

echo help.me.nc.example.com is an alias for fd-nc-001.domain.com.

私が探しているのはです.nc。それ以前のすべての内容を印刷したいと思いますhelp.me

echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | awk '{print $6}'
fd-nc-001.domain.com.
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | grep .nc | awk '{print $1}'
help.me.nc.example.com

ベストアンサー1

これにより、文字列が最初に表示される位置で入力行が切り捨てられます.nc

sed 's/\.nc.*//'

(in内の点は.ncエスケープする必要があります。それ以外の場合は単一の文字と一致します。.*以降は\.nc行の残りの部分と一致します。)

また、入力行に文字列が含まれていない場合は何も出力されません.nc(または置換を実行すると何かが出力され、行に文字列が含まれている場合は何かが出力されます)。

sed -n 's/\.nc.*//p'

この-nオプションは、sed各サイクルの終わりにバッファのデフォルト出力をディセーブルにします。代わりに、p交換コマンドに追加されたフラグは、交換がトリガーされるたびに明示的な出力を実行します。

例:

$ echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | sed 's/\.nc.*//'
help.me
$ echo help.me.XX.example.com is an alias for fd-nc-001.domain.com. | sed 's/\.nc.*//'
help.me.XX.example.com is an alias for fd-nc-001.domain.com.
$ echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | sed -n 's/\.nc.*//p'
help.me
$ echo help.me.XX.example.com is an alias for fd-nc-001.domain.com. | sed -n 's/\.nc.*//p'

(最後のコマンドには出力はありません。)


sed -n 's/\.nc.*//p'以下を使用するのと同じことを行いますawk

awk 'sub(/\.nc.*/, "")'

(すべての行で置換を実行しようとしましたが、sub()コマンドで使用されているパターンが一致する場合にのみ結果を印刷します。)

同じことですが、次のように使用しますpcre2grep

pcre2grep -o '.*?(*positive_lookahead:\.nc)'

(行の先頭と文字列を除くすべての項目と一致します.nc。)

上記の代わりに(*pla:、またはより秘密にすることができます。 GNUがある場合は、前のコマンドで代わりに使用できます。(?=(*positive_lookahead:grepgrep -Ppcre2grep

おすすめ記事