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