파일 내용을 교체해야 함

파일 내용을 교체해야 함

나는 붙어있다. 내용이 포함된 script.txt 파일이 있습니다.

$cat script.txt

SET TABLESPACE CONTAINERS FOR 3
-- IGNORE ROLLFORWARD CONTAINER OPERATIONS
USING (
FILE '/db2data2/dbs/rahtest/rahtest1.lrg'  5120
);


SET TABLESPACE CONTAINERS FOR 4
-- IGNORE ROLLFORWARD CONTAINER OPERATIONS
USING (
  FILE   '/db2data2/dbs/rahtest/rahtest2.lrg'  5120
);

내 요구 사항은 라인의 파일 시스템입니다

FILE '/db2data2/dbs/rahtest/rahtest1.lrg' 5120
FILE   '/db2data1/dbs/rahtest/rahtest2.lrg'  5120

교체해야 해요

/db2data2/dbs/rahtest/rahtest1.lrg

그리고

/db2data2/dbs/rahtest/rahtest2.lrg

다른 파일 시스템과 함께

/db2data3/dbs/rahtest/rahtest1.lrg

그리고

/db2data3/dbs/rahtest/rahtest2.lrg

각기.

다른 부분은 동일해야합니다. 내 출력은 이제 다음과 같습니다 -

FILE '/db2data3/dbs/rahtest/rahtest1.lrg'  5120
FILE '/db2data3/dbs/rahtest/rahtest2.lrg'  5120

내 파일에 반영되어야 합니다. 선 안에 선이 어디에 있는지 모르겠습니다. sed를 사용해 보았습니다. 이 줄을 변수 var1 및 var2에 넣으려고했습니다.

var1=`echo /db2data2/dbs/rahtest/rahtest1.lrg'
var2=`echo /db2data2/dbs/rahtest/rahtest2.lrg'
var3=`echo /db2data3/dbs/rahtest/rahtest1.lrg'
var4=`echo /db2data3/dbs/rahtest/rahtest2.lrg'

내가하려고 할 때

sed 's/$var/$var3' script.txt

/가 있기 때문에 실패합니다. 저는 AIX를 사용하고 있습니다. 내 최종 파일은 다음과 같아야합니다 -

SET TABLESPACE CONTAINERS FOR 3
-- IGNORE ROLLFORWARD CONTAINER OPERATIONS
USING (
FILE '/db2data3/dbs/rahtest/rahtest1.lrg'  5120
);


SET TABLESPACE CONTAINERS FOR 4
-- IGNORE ROLLFORWARD CONTAINER OPERATIONS
USING (
  FILE   '/db2data3/dbs/rahtest/rahtest2.lrg'  5120
);

답변1

텍스트에 a가 있는 경우 sed 매개변수에 대한 구분 기호로 /a와 같은 다른 문자를 사용할 수 있습니다 . 또한, 변수를 사용할 경우 작은따옴표 안에는 변수가 확장되지 않으므로 명령에 큰따옴표( )를 사용해야 |합니다 . 이 시도:""sed

var1='/db2data2/dbs/rahtest/rahtest1.lrg'
var2='/db2data2/dbs/rahtest/rahtest2.lrg'
var3='/db2data3/dbs/rahtest/rahtest1.lrg'
var4='/db2data3/dbs/rahtest/rahtest2.lrg'

sed -e "s|$var1|$var3|g" -e "s|$var2|$var4|" script.txt

답변2

정규식의 변수 정보를 강력하게 처리하려면 정규식 메타 문자를 이스케이프해야 합니다. 이 질문은 여러 번 답변되었으며 나 자신도 여러 번 답변해 보았지만 어쨌든 결론은 다음과 같습니다.

^$*[]\.

^기본 정규식 메타 문자입니다. 이들 각각은 아래와 같이 정규식에서 특별한 의미를 갖습니다.통사론그리고 문자 그대로 해석되지 않습니다. 이들 중 일부의 중요성은 실제로 위치에 따라 달라집니다.가능한적절한 이스케이프 처리 없이 정규 표현식으로 감싸는 것이 의미하는 것은 아닙니다.~해야 한다- 특히 정규식이 검증되지 않은 입력으로 구성된 경우.

하지만 더 많은 것이 있습니다:

delimiter newline &

sed s///^ 대체 구문 문자 입니다 . 구분 기호는 전통적으로 변경 가능하며 자동으로 새 명령의 첫 번째 문자 /로 해석됩니다 .seds

줄바꿈 - 왼쪽정규식성명서의 측면은 실제로 불가피합니다. 거기에는 타당성이 없습니다. 개행 문자를 바꾸는 유일한 방법은 \n이스케이프 문자를 사용하는 것입니다. 그러나 유일한 방법은얻다정규 표현식에서 발견된 패턴 공간의 줄 바꿈은 사용자가 직접 입력한 줄 바꿈일 가능성이 있으므로 일반적으로 이는 문제가 되지 않습니다. 교체 오른쪽 s///-바꾸다side - 개행 문자는 다른 모든 것과 마찬가지로 이스케이프 가능합니다. \이는 이스케이프 메타 문자입니다. 에 대해서도 마찬가지입니다 &.

따라서 강력한 sed변수 스크립트를 작성하려면 이를 이스케이프해야 합니다. 이것이 유일한 방법입니다. 문에 구분 기호가 있을 것으로 예상하여 구분 기호를 변경하는 것은 신뢰할 수 있는 접근 방식이 아닙니다. 입력의 유효성을 검사하고 구문 오류 가능성을 제거하거나 구문 문자를 이스케이프하여 원하는 의미를 나타냅니다. 강력한 프로그램을 작성하는 두 가지 방법이 있습니다. 다른 방법은 없습니다.

운 좋게도 sed이로 인해 일이 매우 쉬워졌습니다. 앞에서 언급했듯이 \백슬래시는 이스케이프 메타 문자이며 두 배로 늘어나면 자체적으로 이스케이프됩니다. 그래서 우리는 sed그것을 탈출하는데 사용할 수 있습니다 sed.

printf %s\\n "$regex_field" "$replace_field" |
sed -ne'h;n' -e's|[\&/]|\\&|g'               \
    -ex      -e's|[]/\.$^*[]|\\&|g'          \
    -eG      -e's|\(.*\)\n\(.*\)|s/\1/\2/|p' |
sed -f-      edit_file

바라보다? 입력은 개행으로 구분됩니다. 따라서 작성된 대로 개행은 허용되지 않습니다.$regex_field 또는 $replace_field. 너할 수 있다이를 처리하는 것도 가능하지만 그렇지 않으므로 입력 기대치를 검증하여 이를 제외합니다.

어떤 경우든, 입력 라인은 첫 번째 라인과 쌍을 이루며 sed, a의 오른쪽과 연관된 문자를 이스케이프하면 h각 라인 쌍의 전반부의 복사본을 저장하고 두 번째 라인으로 점프합니다. 대체 진술. 그런 다음 예약된 공간과 패턴 공간을 변경하고 왼쪽에서 이스케이프한 다음 줄 줄 구분 기호로 구분된 RHS를 LHS에 추가합니다. 마지막으로 수행하는 작업은 이스케이프된 명령을 표준 출력으로 인쇄하기 전에 이러한 비트를 추가하는 것입니다.nsed s///xG\ns///p

두 번째는 sed스크립트 파일을 읽습니다.- /dev/fd/0(보통 표준 입력으로 해석되지만 그렇지 않은 경우 시도해 볼 수도 있습니다 )그런 다음 이름이 지정된 스크립트를 적용하십시오.edit_file.

관련 정보