テキスト構造に影響を与えずに単語を強調表示

テキスト構造に影響を与えずに単語を強調表示
$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を使用してください。複数の検索パターンを指定したり、ハイフン(-)で始まるパターンを保護したりできます。 (-ePOSIXで指定)

必要に応じて、これらのパターンを単一の拡張正規表現に組み合わせることもできます。

$ 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

関連情報