sed 출력의 추가 공간은 다른 스크립트에 영향을 미칩니다

sed 출력의 추가 공간은 다른 스크립트에 영향을 미칩니다

sed 명령에서 추가 공백을 제거해야 함

다음을 사용하여 파일에서 $$ENV$$_ 뒤에 문자열을 가져올 수 있습니다.

sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' file.txt

명령 실행:

TAB=$(sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' $file.txt)

이 변수($TAB)는 다른 파일의 값을 명령으로 바꾸기 위해 다른 명령을 전달합니다.

cat backup.txt | sed 's%\$\$BTABLE\$\$%"${TAB}"''%g' > $file_bkp1.txt

하지만 내 출력에는 추가 공간이 생깁니다.

파일.txt

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE , NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT, 
    DEFAULT MERGEBLOCKADSRATIO

Sed 명령은 file.txt에서 값을 가져옵니다.

TAB=$(sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' file.txt)

backup.txt의 값(from: $$BTABLE$$)을 (TEMP_ESM.EMPASGMTAMPTMPRTRSE)로 바꾸는 명령

cat backup.txt | sed 's%\$\$BTABLE\$\$%"${TAB}"''%g' > file_bkp.txt

백업.txt 입력 파일

CREATE MULTISET TABLE $$ENV$$_$$BTABLE$$_NEW ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      AR_ID INTEGER NOT NULL,
      AR_TO_RTE_TY_RL_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_BASIS_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_ID INTEGER NOT NULL,

끝에 추가 공백이 있는 file_bkp.txt의 출력(굵은 글자로 강조 표시됨) 결과물 파일:

다중 세트 테이블 생성$$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE _NEW,백업 없음,
     예전에는 일기장이 없었는데,
     일기장이 없는 후,
     체크섬 = 기본값,
     기본 병합 블록 비율
     (
      AR_ID 정수가 비어 있지 않습니다.
      AR_TO_RTE_TY_RL_TY_ID VARCHAR(32) 문자 집합 LATIN NOT CASESPECIFIC NOT NULL,
      RTE_BASIS_TY_ID VARCHAR(32) 문자 집합 LATIN NOT CASESPECIFIC NOT NULL,
      RTE_TY_ID VARCHAR(32) 문자 세트 LATIN NOT CASESPECIFIC NOT NULL,
      RTE_ID 정수가 비어 있지 않습니다.

답변1

태그 가져오기

TAB=$(sed -n 's%.*\$\$ENV\$\$_\(.*\)_NEW.*%\1%p' file.txt)

-n인쇄하도록 명시적으로 지정된 줄을 제외한 모든 줄의 인쇄를 건너뛰는 데 사용됩니다 . p대체 플래그는 "대체가 발생하면 이 줄을 인쇄합니다"를 의미합니다.

또한 관심 있는 행의 경우 하위 문자열을 로 둘러싸서 관심 있는 정확한 하위 문자열을 제외한 모든 항목을 필터링합니다 \(..\). 그런 다음 교체에서 "역참조"를 사용하여 다음 대괄호 안에 텍스트를 가져올 수 있습니다 \1.

이 값을 사용하여 다음을 대체합니다.

sed 's%\$\$BTABLE\$\$%'"${TAB}"'%g'

이것은 인용문을 약간 조정하여 명령을 약간 변경한 것입니다.

답변2

알겠습니다. 여기에 입력하세요.

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE , NO FALLBACK ,

sed 스크립트는 sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//'먼저 해당 항목 $$ENV$$_( /.*$$ENV$$_/!d; s///)을 제거한 다음 s/,.*//쉼표( ) 뒤의 모든 항목을 제거한 다음 모든 선행 공백( s/^[ \t]*//)을 제거하지만 쉼표 앞의 공백은 제거하지 않습니다. 따라서 출력은 이며 TEMP_ESM.EMPASGMTAMPTMPRTRSE␣후행 공백( )이 있습니다. 나는 당신의 결과물에 공간이 계속된다고 생각합니다.

문자열의 나머지 공백을 제거하려면 마지막 대체 항목을 s/[ \t]*//g(remove anchor ^, add ) 로 변경할 수 있다고 생각합니다 ./g

관련 정보