
$cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
上記の出力には空行があります。
$cat contents.txt | grep cat
catという単語が強調表示されますが、結果のテキストもマージされ、空白行が削除されます。
cat-1.15
cat-1.15
cat-1.15
cat-1.18
唯一の違いが強調表示されたgrep用語になるように、テキスト構造に影響を与えずにどのように強調表示できますか?
答え1
GNU grepを使用すると、オプションでこれを行うことができます-z
。
-z, --空のデータ
入出力データを一連の行として扱います。各行は改行文字の代わりに0バイト(ASCII NUL文字)で終わります。 -Zまたは--nullオプションと同様に、このオプションはsort -zなどのコマンドと一緒に使用して任意のファイル名を処理できます。
これもウルムチ大学。 grep を使用して入力ファイルを指定できます。
$ grep --color cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
$ grep --color -z cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
答え2
別の考えられる解決策は2つのパターンを提供することですgrep
。 1つは検索する実際のパターンまたは用語、2番目は空の文字列です。
$ grep --color -e 'cat' -e '' testfile.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
この-e
オプションは、複数のモードを指定するために使用されます。マニュアルから:
-e PATTERN
、--regexp=PATTERN
パターンとしてPATTERNを使用してください。複数の検索パターンを指定したり、ハイフン(-)で始まるパターンを保護したりできます。 (
-e
POSIXで指定)
必要に応じて、これらのパターンを単一の拡張正規表現に組み合わせることもできます。
$ grep --color -E 'cat|' testfile.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
また、複数のキーワードを強調表示する必要がある場合は、リストに別のモードを追加するだけです。
答え3
grepにはより多くの可能性があります。
grep は次のインスタンスを 0 個以上検索しますcat
。
grep --color '\(cat\)*' contents.txt
グレブcat
または空の文字列:
grep -E --color 'cat|' contents.txt
(-Eは拡張正規表現構文を指定します。 egrep
ここで代わりに使用できますgrep -E
。)
またはあなたは使用することができますsed
手動着色の使用ANSIエスケープコード:
red='\c[[1;31m'
default='\c[[0m'
sed "s/cat/${red}cat${default}/g" contents.txt
シェル変数は便宜上のみここにred
あります。その値はsed式にインラインで配置することもできます。default
答え4
次のコマンドを試してみました。
sed -r "/cat/{N;s/^$/&=/}" filename
awk '{if(((length($1)>3)&& ($1 ~ /cat/))||($0~/^$/)){print $0}}' filename