그래서 나는 이와 같은 문자열을 가지고 있습니다 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
수 없습니다 . 따라서 다음을 사용하십시오 .,
\|
sed
sed -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