sed를 사용하여 한 파일의 패턴을 다른 파일의 전체 내용으로 바꾸려고 합니다.
현재 나는 다음을 사용하고 있습니다 :
sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt" > "output.txt"
'
그러나 대체 파일에 , "
또는 같은 문자가 포함되어 있으면 /
입력이 삭제되지 않아 오류가 발생하기 시작합니다.
사용해보려고 했는데이 가이드도와주려고 하는데 이해하기 어렵네요. 제안된 명령을 시도하면 r file
문자열만 표시됩니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
답변1
이것당신을 위해 일해야합니다. 파일 '
에 및 문자가 있음을 이미 지정했기 때문에 중복으로 종료하도록 투표하지 않았습니다 /
. "
그래서 다음 테스트를 해봤습니다.
나는 file1
다음을 가지고 있습니다.
cat file1
ramesh' has " and /
in this file
and trying
"to replace'
the contents in
/other file.
이제 file2
다음과 같습니다.
cat file2
This is file2
PATTERN
After pattern contents go here.
공유된 링크를 바탕으로 다음과 같이 만들었습니다 script.sed
.
cat script.sed
/PATTERN/ {
r file1
d
}
sed -f script.sed file2
이제 내가 얻는 출력 으로 명령을 실행하면 다음과 같습니다.
This is file2
ramesh' has " and /
in this file
and trying
"to replace'
the contents in
/other file.
After pattern contents go here.
편집하다: 이는 파일의 여러 패턴에도 적용됩니다.
답변2
솔루션이 필요한 경우 awk
아래 표시된 솔루션을 사용할 수 있습니다.
awk '/PATTERN/{system("cat file1");next}1' file2
시험
cat file1
ramesh' has " and /
in this file
and trying
"to replace'
the contents in
/other file.
file2
이제 다음이 있습니다 .
cat file2
This is file2
PATTERN
After pattern contents go here.
PATTERN
이제 위에서 언급한 awk
명령을 사용합니다.
산출:
This is file2
ramesh' has " and /
in this file
and trying
"to replace'
the contents in
/other file.
After pattern contents go here.
ramesh' has " and /
in this file
and trying
"to replace'
the contents in
/other file.
인용하다
답변3
존재하다:
sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt"
'
"
문제가 되지 않습니다 . 이것들은 특별한 것이 아닙니다 sed
. 문제는 및 &
개행 문자입니다. 다른 명령을 사용하여 이스케이프할 수 있습니다.\
/
sed
sed "s/PATTERN/$(sed 's@[/\&]@\\&@g;$!s/$/\\/' replacement.txt)/g" openfile.txt
에서 후행 줄 바꿈을 제거합니다 replacement.txt
. 이것이 당신이 원하는 것이 아니라면 이렇게 할 수 있습니다
replacement=$(sed 's@[/\&]@\\&@g;s/$/\\/' replacement.txt; echo .)
replacement=${replacement%.}
sed "s/PATTERN/$replacement/g" openfile.txt
답변4
GNU를 사용하면 sed
스크립트 어디에서나 원하는 대로 무엇이든 할 수 있습니다 e
. cat
달리 r
- 라인 사이클이 끝날 때 출력을 예약합니다.(이것은 매우 실망스러울 수 있습니다!)는 또는 e
와 유사하게 작동하며 출력 을 즉시 기록합니다. 다음은 그 사용에 대한 몇 가지 예입니다.i
c
printf %s\\n 'these are some words' \
'that will each appear' \
'on their own line' |
sed 's/.*words/echo & ; cat file/e'
these are some words
these
are
some
more
words
that
are
stored
in
a
file
that will each appear
on their own line
사용 방법은 다음과 같습니다.
printf %s\\n 'these are some words' \
'that will each appear' \
'on their own line' |
sed 's/\(.*\)\n*words/\1\n&/;//P;s//\ncat file/ep;s/.*\n//'
these are some
these
are
some
more
words
that
are
stored
in
a
file
that will each appear
on their own line