sed를 사용하여 일치 항목을 여러 줄 문자열로 대체

sed를 사용하여 일치 항목을 여러 줄 문자열로 대체

중복 가능성:
여러 줄 문자열을 다른 문자열에 삽입

다음 과 같은 파일이 있습니다 foo.txt.

부자
술집
버저 소리

bar각 항목을 변수에 저장된 여러 줄 문자열로 바꾸고 싶습니다 $bar.

1
2

다음으로 이어진다:

부자
1
2
버저 소리

다음을 사용하여 이 작업을 수행 할 수 있습니다 awk.

에코 "$bar" |
        if(파일명=="-")
        {
            만약(i!="")
            {
                나=나"\n"
            }
            나=나$0
        }
        기타
        {
            if($0 == "바")
            {
                나를 인쇄해줘
            }
            기타
            {
                인쇄
            }
        }
    }'

sed그러나 using에서 동일한 작업을 수행 하려고 하면 sed 's/bar/'"$bar"'/' foobar.txt오류가 발생합니다.

sed: 1: “s/bar/1
2
3/": 대체 패턴 내에서 이스케이프되지 않은 개행 문자

이 문제가 해결될 수 있습니까?

다른 표준 도구를 사용하여 이 작업을 수행하는 더 쉬운 방법이 있다면 알고 싶습니다.

답변1

에서는 sed명령 오른쪽에서 개행 문자를 이스케이프해야 하므로 s다음과 같이 작성해야 합니다.

sed 's/foo/1\
2\
3/g'

일부 sed구현에서는 다음도 지원합니다(비표준).

sed 's/foo/1\n2\n3/g'

바꾸 려면 $bar먼저 각 개행 문자 앞에 백슬래시를 삽입해야 합니다. 이 작업을 수행할 때 각 슬래시, 백슬래시 및 앰퍼샌드 문자 앞에 백슬래시도 삽입해야 합니다.

그것은 다음과 같습니다:

bar_escaped=$(printf '%s\n' "$bar" | sed 's,[\/&],\\&,g;s/$/\\/')
bar_escaped=${bar_escaped%?}
sed "s/foo/$bar_escaped/g"

답변2

내가 한 일은 명령줄에서 여러 줄 작업을 수행할 수 없기 때문에 명령에 패턴을 지정하는 대신 패턴 파일을 sed만든 다음 지정된 파일로 호출하는 것이었습니다(즉, \n은 유효하지 않습니다). sed예를 들어

sed -f pattern_file.sed infile.txt

내 경우에는 읽은 각 줄을 찾아 다음 줄에 alarm_if_fail: 1추가하고 싶습니다 . application: XYZ그래서패턴 파일.sed다음과 같습니다.

1,/^END/{


        s/^alarm_if_fail: 1$/&\
application: XYZ/


}

만약에파일.txt 입력좋다

Unix
Stackexchange

alarm_if_fail: 1

ABC

그러면 ed -f pattern_file.sed infile.txt돌아올 것이다

Unix
Stackexchange

alarm_if_fail: 1
application: XYZ

ABC

관련 정보