grep에 대한 정규식 패턴 만들기

grep에 대한 정규식 패턴 만들기

그래서 나는 이와 같은 문자열을 가지고 있습니다 LST = fr, de, pl, ru, ch, us, uk, ca. 여기서는 향후 grep 작업을 위한 정규식 패턴을 생성해야 하므로 문자열을 다음과 같이 수정해야 합니다.fr\|de\|pl\|ru\|ch\|us\|uk\|ca

set LST = `grep "^LST *=" /remote/file/config.ini | sed 's/LST *= *//' | sed 's/ *//g' | tr , "\|"`

불행하게도 tr , "\\|"주어진 문자는 내 정규식 패턴을 만들기 위해 대체되지 않습니다. 결과는 입니다 frdeplruchusukca. 정규식 패턴을 생성하려면 어떻게 해야 합니까? 또는 LST 변수의 발생을 찾고 de발견된 값을 LST 변수로 설정하려면 어떻게 해야 합니까?

config.ini 예

; sample of ini file
[SITE_PREF]

LST = fr, de, pl, ru, ch, us, uk, ca
TASKLIST = T1,TT3,TT0

답변1

우선, 한 번에 한 문자만 처리할 수 있으며 a를 a (한두 문자) 로 바꿀 tr수 없습니다 . 따라서 다음을 사용하십시오 .,\|sedsed -e 's/,/\\|/'

둘째, Bash와 GNU sed에서 작동하는 것처럼 보이는 the grep와 s를 결합할 수 있습니다 .sed

$ LST=$(sed -n '/^LST *=/ {s/^LST *= *//; s/, */\\|/g; p}' config.ini)
$ echo "$LST"
fr\|de\|pl\|ru\|ch\|us\|uk\|ca

(기본적으로 다음과 같습니다. 일치하는 모든 줄에서 /^LST *=/중괄호 안에 작업을 수행합니다. 두 개를 s바꾸고 p해당 줄을 인쇄합니다.)

셋째, tr인용문이 유효한지 여부에 따라 쉼표를 백슬래시나 파이프로 변경해야 합니다.

$ echo "fr,de,pl" | tr , "\|" 
fr|de|pl
$ echo "fr,de,pl" | tr , '\\|'
fr\de\pl

그러나 당신은 그렇게 하지 않았고 아무것도 얻지 못했습니다. Bash로 이것을 재현할 수는 없지만 set구문은 다음과 같 csh으며 이를 사용할 때 이상한 동작이 발생합니다 tcsh. 일부 경우에. 전부는 아닙니다.

좋아요:

$ tcsh
> echo "fr,de,pl" | sed 's/,/\\|/'
fr\|de,pl
> set LST = `echo "fr,de,pl" | sed 's/,/\\|/'`
> printf "%s\n" "$LST"
fr\|de,pl

별로 좋지 않다:

$ tcsh 
> echo "fr,de,pl" | sed 's/, */\\|/'
fr\|de,pl
> set LST = `echo "fr,de,pl" | sed 's/, */\\|/'`
> printf "%s\n" "$LST"
fr|de,pl

내가 볼 수 있는 유일한 차이점은 두 번째 경우의 별표입니다.

답변2

그리고 awk:

... | awk -F'= ' '{gsub(", ", "\\|", $2); print $2}'
  • -F '= '필드 구분 기호를 다음으로 설정하세요.=

  • gsub(", ", "\\|", $2)두 번째 필드의 ,모든 항목을 다음으로 바꿉니다 .\|

  • print $2두 번째 필드 인쇄

예:

$ awk -F'= ' '{gsub(", ", "\\|", $2); print $2}' <<<'LST = fr, de, pl, ru, ch, us, uk, ca'
fr\|de\|pl\|ru\|ch\|us\|uk\|ca

답변3

fr\|de\|pl\|ru\|ch\|us\|uk\|ca그러나 grep의 정규 표현식으로는 표준/이식성이 없습니다.

fr
de
pl
ru
ch
us
uk
ca

이는 개행으로 구분된 항목이고 표준이며 grep -F고정 문자열 검색에도 사용할 수 있습니다. 따라서 검색어에 정규식 연산자가 포함되어 있으면 문제가 없습니다.

따라서 다음과 같이 할 수 있습니다(여기서는 스크립팅에 사용하고 싶지 않은 POSIX 셸 구문을 사용하여 csh).

search_term=$(
  sed '
    /^LST *= */!d
    s///
    s/ *, */\
/g' config.ini
)

grep -F -- "$search_term" some-file

구현에서 지원하는 경우 전체 단어만 검색하는 옵션을 grep전달할 수도 있습니다 .-w

답변4

perl -p0E '($_)= /LST = (.*)/; s/, /\\|/g' config.ini

관련 정보