대소문자를 구분하지 않는 일치를 수행해야 합니다.grepdiv도구. grep과 달리 매개변수가 없지만 --extended-regexp
가능합니까?
Perl이나 비슷한 것을 시도했지만 작동하지 않습니다.
$ echo SOME | egrep '(?i)some'
$ echo SOME | grepdiff --extended-regexp '(?i)some'
grepdiff: repetition-operator operand invalid
답변1
grep
Perl과 유사한 RE를 사용하도록 가족에게 알려야 합니다 .
echo SOME | grep -P '(?i)some'
SOME
안타깝게도 이 플래그는 사용할 수 없으며 grepdiff
, 내가 아는 한 사용할 수 없습니다 -i
(대소문자 구분 일치).
pgrepdiff
여기에 PCRE를 사용하여 출력을 일치시킬 수 있는 작은 스크립트가 있습니다 diff
. 허용되는 플래그 는 허용되지 않습니다 grepdiff
. 명명된 파일에서 읽거나표준 입력제공되지 않은 경우. RE를 생략하면 비용이 많이 드는 연산자가 됩니다 cat
.
#!/bin/bash
#
# Usage: pgrepdiff <re> [<files...>]
#
# https://unix.stackexchange.com/a/424566/100397
#
tmpd=$(mktemp --tmpdir --directory 'pgd.XXXXXXXXXX')
re="$1"
shift
# Split the file into its context diff parts
cat "$@" | csplit - -f "$tmpd/xx." -k -n4 -s -z '/^@@/' '{*}'
# Save the header preamble for a match
mv -f "$tmpd/xx.0000" "$tmpd/head"
head=
# Iterate across all the diff segments
shopt -s nullglob
for xx in "$tmpd"/xx.????
do
if grep -q -P "$re" "$xx"
then
[[ -z $head ]] && cat "$tmpd/head" && head=yes
cat "$xx"
fi
done
# Tidy up
rm -rf "$tmpd"
# Return 0 (success) iff we matched something
[[ -n $head ]]