중복 가능성:
여러 줄 문자열을 다른 문자열에 삽입
다음 과 같은 파일이 있습니다 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