INPUT | grep --color=always "$string\{1,1\}"
...아아, $string의 모든 인스턴스가 강조 표시됩니다. 문서를 읽을 때 "{1,1}"은 첫 번째 인스턴스만 강조 표시되도록 해야 합니다. 아니면 더 좋은 도구가 있나요? sed를 사용할 수 없습니다
INPUT | sed -r "s|$string|${red}$string${nrm}|I"
(${red} 및 ${nrm}은 색상 코드일 뿐입니다)
여기 INPUT은 대소문자를 구분하지 않고 찾을 수 있는 파일 목록이므로 sed에서 "I" 옵션을 사용하면 파일 목록의 대소문자가 명령 입력의 정확한 텍스트로 변경됩니다. 즉, 예, 대소문자를 구분하지 않는 파일을 검색하고 싶지만 파일 목록에 있는 문자열의 대소문자에 관계없이 강조표시됩니다.
my_command *file_name*
...대소문자를 구분하지 않고 파일을 찾기 위해 "찾기"를 사용하지만 목록에서 강조하고 싶은 점은 다음과 같습니다.
file_name
FILE_nAME
file_NAME_this_file_has_a_long_file_name
...그러나 첫 번째 경우에만 해당됩니다(파일 이름에 입력 문자열의 중복이 포함될 수 있음). 따라서 위의 마지막 줄에서 "file_NAME"은 강조 표시되지만 "file_name"은 강조 표시되지 않습니다.
grep은 대소문자 문제에 문제가 없지만 sed는 문제가 있습니다. OTOH, sed는 경기 후 중지하는 방법을 알고 있지만 grep은 모르는 것 같습니다. 아니면 더 좋은 방법이 있나요?
답변1
grep
Perl과 유사한 정규 표현식을 지원하는 경우 -P
다음을 수행할 수 있습니다.
grep --color=always -P "^.*?\K\Q$string\E"
^
일치 항목을 줄의 시작 부분에 고정 하기 때문에 한 줄에 한 번만 일치할 수 있습니다 . 다음은 .*?
원하는 수의 문자와 일치하는 것 입니다.가능한 적게, 및 / $string
내에서 \Q
변수에 정규식 연산자(제외)가 포함되어 있어도 \E
해당 내용은 문자 그대로 일치합니다. 다음 내용만 ept로 지정하므로 여기서는 색상으로 표시됩니다.$string
\E
\K
K
또는 GNUism에 의존하지 않고 실제를 사용할 수도 있습니다.
STRING=$string perl -ne 'print if s/\Q$ENV{STRING}\E/\e[31m$&\e[m/'
포함된 경우에도 $string
유효합니다 \E
.
답변2
난 당신을 생각할 수 있는패턴 교체를 사용하는 경우 다음을 사용하세요 sed
(일치에서는 대소문자를 구분하지 않지만 교체는 검색된 패턴이 아닌 캡처된 패턴을 사용함).
INPUT | sed -r "s|(${string})|${red}\\1${nrm}|I"
또한 @don_crissti가 알아차렸듯이,모두패턴을 찾으려면 캡처 그룹을 사용할 필요조차 없으며 "무엇이든지" &
코드를 사용할 수 있습니다. 이 코드는 아마도 약간 더 빠를 수도 있습니다.
INPUT | sed -r "s|${string}|${red}&${nrm}|I"
색상 코드 대신 두 개의 문자열을 사용하면 내 bash에서 작동하는 것 같습니다.
$ red="_RED_"
$ nrm="_NORM_"
$ string="amd"
$ echo -e "linux-5.4.0-amd-backfire.tar.bz2\\nThis is AMD Radeon\\nNames: Amdiranifani amd Jefri" \
| sed -r "s|(${string})|${red}\\1${nrm}|I"
linux-5.4.0-_RED_amd_NORM_-backfire.tar.bz2
This is _RED_AMD_NORM_ Radeon
Names: _RED_Amd_NORM_iranifani amd Jefri
세 번째 줄의 두 번째 "amd"는 대체되지 않으며, 다른 모든 대체는 원래 대소문자를 유지합니다.
구문은 grep
첫 번째 항목과 일치함을 의미합니다.자꾸패턴의 일부이므로 "bababa"에서는 첫 번째 "ba"만 일치하지만 "baba___ba"에서는 첫 번째 및 세 번째 항목과 일치합니다.
확실히그렙모두일치하므로 이 경우에는 사용할 수 없습니다.