텍스트 처리를 위해 awk 사용 [닫기]

텍스트 처리를 위해 awk 사용 [닫기]

다음과 같은 텍스트가 있습니다.

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}}및를 사용하여 테이블을 쿼리한 후 얻은 단일 값 으로 쿼리에서 대체됩니다 .val1val2

답변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}}? 그렇다면 어떻게 해야 하는지 설명해야 합니다.쿼리의 [그들]을 [나중에] 돌려받을 단일 값으로 바꾸세요.이 요구 사항은 명시적인 코드로 해결하기에는 너무 광범위합니다.

관련 정보