回答:
前3文字、後4文字
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
brew install homebrew/dupes/grep
として実行しますggrep
。
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt
これは、パターンの前後5文字までに一致します。-oスイッチは、grepに一致のみを表示し、-Eは拡張正規表現を使用するように指示します。式を引用符で囲んでください。そうしないと、シェルによって解釈される可能性があります。
{0,255}
作品が{0,256}
できますgrep: invalid repetition count(s)
あなたは使うことができます
awk '/test_pattern/ {
match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
つまり、このように:
grep -o '.\{0,20\}test_pattern.\{0,20\}' file
?
これにより、の両側に最大20文字が印刷されますtest_pattern
。\{0,20\}
表記法は次のようである*
が、指定は20回の繰り返しの代わりにゼロにゼロまたはmore.Theは-o
むしろ全体のラインよりも、唯一の試合自体を表示するように言います。
grep: Invalid content of \{\}
ではgawk
、一致関数を使用できます。
x="hey there how are you"
echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
ere are
でよろしければperl
、より柔軟な解決策:パターンの前に3文字、実際のパターン、パターンの後の5文字の順に印刷します。
echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
これは、文字だけでなく単語にも適用できます。以下は、実際に一致する文字列の前に1つの単語を出力します。
echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey
以下は、パターンの後に1つの単語を出力します。
echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how
以下は、パターンの前に1つの単語を出力し、次に実際の単語、次にパターンの後に1つの単語を出力します。
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/'
hey there how
あなたは見つけるために正規表現のgrepを使用することができます+ハイライトのために2番目のgrep
echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string
23_string_and
これらの不可解なコマンド修飾子を簡単に覚えることは決してないので、私はトップの回答を取り、それを~/.bashrc
ファイル内の関数に変換しました。
cgrep() {
# For files that are arrays 10's of thousands of characters print.
# Use cpgrep to print 30 characters before and after search patttern.
if [ $# -eq 2 ] ; then
# Format was 'cgrep "search string" /path/to/filename'
grep -o -P ".{0,30}$1.{0,30}" "$2"
else
# Format was 'cat /path/to/filename | cgrep "search string"
grep -o -P ".{0,30}$1.{0,30}"
fi
} # cgrep()
実際の動作は次のとおりです。
$ ll /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
-rw-r--r-- 1 rick rick 25780 Jul 3 19:05 /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
$ cat /tmp/rick/scp.Mf7UdS/Mf7UdS.Source | cgrep "Link to iconic"
1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
$ cgrep "Link to iconic" /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
問題のファイルは1つの連続した25K行であり、regularを使用して探しているものを見つけることはできませんgrep
。
cgrep
そのparallels grep
メソッドを呼び出すことができる2つの異なる方法に注意してください。
「$ 2」が設定されている場合にのみ渡される関数を作成する「より洗練された」方法があり、4行のコードを節約します。私はそれを便利に持っていません。のようなもの${parm2} $parm2
。見つかった場合は、関数とこの回答を修正します。