web-dev-qa-db-ja.com

grepの新しい行のパターンを与える方法は?

Grepの新しい行のパターンを与える方法は?先頭に新しい行、末尾に新しい行。正規表現ではありません。\nのようなもの。

66
tuxnani

grepパターンは個々の行と照合されるため、入力で見つかった改行とパターンを照合する方法はありません。

ただし、次のような空の行を見つけることができます。

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 
68
arash kordi

通常のpcregrepの代わりにgrepを試してください:

pcregrep -M "pattern1.*\n.*pattern2" filename

-Mオプションを使用すると、複数行にわたって一致させることができるため、\nとして改行を検索できます。

75
nullrevolution

この方法を使用できます...

grep -P '^\s$' file
  • -PはPerlの正規表現に使用されます(POSIX grepの拡張)。
  • \sは空白文字と一致します。 *が続く場合、空行にも一致します。
  • ^は、行の先頭に一致します。 $は行末に一致します。
19
Mani R

@jarnoのおかげで、私は-zオプションについて知っていて、GNU grepを-Pオプションと一緒に使用すると、\nに対してマッチングが可能であることがわかりました。 :)

例:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

barを印刷します

12
rubystallion

回避策として(非ポータブル-Pを使用せずに)、一時的に改行文字を別の文字に置き換えて、元に戻すことができます。例:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

基本的には、完全一致_foo_を探します。ここで、_\nを意味します(したがって__ = \n\n)。とにかく各パターンが新しい行に印刷されるので、tr '_' '\n'で元に戻す必要はありません。したがって、_を削除するだけで十分です。

6
kenorb

見つけたばかり

grep $'\r'

Bashでcスタイルのエスケープに$'\r'を使用しています。

この記事

2
HHHartmann