다음과 같은 텍스트가 있습니다.
select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}
파일에 써야 해요
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}
각 항목은 자체 라인에 있습니다.
시도해 보았지만 awk -F '[{}]' '{print $2}'
첫 번째 항목만 인쇄하고 {}
접미사 및 접두사를 추가할 때 {}
구문 오류가 있습니까 ?
추가 요구 사항
{{va1,val2}}
및를 사용하여 테이블을 쿼리한 후 얻은 단일 값 으로 쿼리에서 대체됩니다 .val1
val2
답변1
또는 다음을 사용하십시오 sed
.
sed 's/select //;s/ from[^}]* //;s/},{/}\n{/g;s/}}{{/}}\n{{/g;s/\s*and\s*/\n/g'
예
$ echo 'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}' | \
sed 's/select //;s/ from[^{]*//;s/},{/}\n{/g;s/}}{{/}}\n{{/g;s/\s*and\s*/\n/g'
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}
작동 방식:
s/select //;
select
- 처음부터 삭제s/ from[^{]*//;
-from.*
위에서 아래로 첫 번째 항목을 삭제합니다.{
s/},{/}\n{/g;
- 모두},{
로 변환}\n{
s/}}{{/}}\n{{/g;
- 모두}}{{
로 변환}}\n{{
s/\s*and\s*/\n/g'
- 모두and
로 변환\n
답변2
당신이 사용할 수있는grep명령을 실행하면 매뉴얼 페이지에서 다음을 찾을 수 있습니다.
grep은 각 파일에서 패턴을 검색합니다. FILE "-"는 표준 입력을 나타냅니다. FILE이 제공되지 않으면 재귀 검색은 작업 디렉터리를 확인하고 비재귀 검색은 표준 입력을 읽습니다. 기본적으로 grep은 일치하는 줄을 인쇄합니다.
-o, --only-matching 일치하는 줄 중 일치하는(비어 있지 않은) 부분만 인쇄합니다. 각 부분은 별도의 출력 줄에 표시됩니다.
-e PATTERN, --regexp=PATTERN PATTERN을 패턴으로 사용합니다. 이 옵션을 여러 번 사용하거나 -f(--file) 옵션과 함께 사용하면 지정된 모든 패턴이 검색됩니다. 이 옵션은 "-"로 시작하는 패턴을 보호하는 데 사용할 수 있습니다.
귀하의 질문에 대해:
echo 'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}' | grep -o -e "{\{2\}[^{]*}\{2\}"
{\{2\}
방법{기호는 정확히 두 번 나타납니다.[^{]*
다음을 제외하고 언제든지 모든 문자를 나타냅니다.{.}\{2\}
방법}기호는 정확히 두 번 나타납니다.
결과는 다음과 같습니다:
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}
답변3
이건 어때. 필드 2의 각 "}"를 "}"로 바꾼 다음 필드 2를 인쇄합니다.
awk '{gsub(/},/,"} ",$2);print $2}' file
또는 sed
"select"와 "from" 사이의 텍스트를 제거하고 각 "}"를 "}"로 바꿉니다.
sed 's/^select \({.*}\) from .*/\1/;s/},/} /g' file
답변4
grep
대신 을 사용하겠습니다 awk
. 이 -P
플래그는 기본값 grep
대신 PCRE 정규 표현식을 사용해야 합니다..*?
가능한 적게), 이 -o
플래그는 grep
일치하는 구성요소만 인쇄합니다.
grep -Po '{{.*?}}'
예:
grep -Po '{{.*?}}' <<<'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}'
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}
귀하의 검색어에 {{va1,val2}}
일치하는 항목이 없으므로 "추가 요구 사항"은 의미가 없습니다. 아니면 예를 들어 일치하는 항목으로 일반화합니까 {{112,department}}
? 그렇다면 어떻게 해야 하는지 설명해야 합니다.쿼리의 [그들]을 [나중에] 돌려받을 단일 값으로 바꾸세요.이 요구 사항은 명시적인 코드로 해결하기에는 너무 광범위합니다.