교체하고 싶은 문자열이 많은 파일이 있으므로 다음과 같은 간단한 명령을 사용하는 방법을 생각해 보았습니다.
sed 's/string1/string2/g' file1 > out
그러나 수동으로 반복하기에는 문자열이 너무 많습니다. 그래서 교체할 모든 문자열의 목록을 한 줄씩 작성하고 파일 이름을 A로 지정했습니다. 그런 다음 모든 교체 문자열의 목록을 만들고 파일 B로 이름을 지정했습니다.
다음과 같은 방법이 있습니까?
sed 's/line i of file A/line i of file B/g' file1 > out
파일 A의 각 줄에 대해?
답변1
같은 줄에 입력 문자열과 대체 문자열이 모두 포함된 파일을 만드는 것이 더 쉬울 것입니다(입력 문자열과 대체 문자열에 공백이 포함되어 있지 않다고 가정). 그런 다음 다음과 같이 간단하게 수행할 수 있습니다.
while read n k; do sed -i "s/$n/$k/g" file1; done < fileA
편집하다:
Nykakin의 답변을 본 후 그의 제안과 내 제안을 결합한 두 파일로 동일한 작업을 수행할 수 있다는 것을 깨달았습니다.
paste fileA fileB | while read n k; do sed -i "s/$n/$k/g" file1; done
답변2
이것은 기본적으로 첫 번째 아이디어이지만 대체 명령을 파일에 넣어 관리하기가 더 쉽습니다.
tmpfile=/tmp/Asasuser.$$ 실행 3< 파일A 실행 4< 파일B 읽는 동안 -r astring <&3 하다 –r bstring <&4 읽기 echo "s/$astring/$bstring/" >> "$tmpfile" 완료 실행 3<&- 4<&- sed –f "$tmpfile" 파일1 > 출력 rm –f "$tmp파일"
이는 fileA
과 fileB
라인 수가 동일하고(그리고 해당 숫자는 0보다 크다) 둘 다 이스케이프되지 않은 /
문자가 없다고 가정합니다.
답변3
필요한 명령을 생성하면 됩니다. 목록이 있는 파일을 lista 및 listb라고 가정해 보겠습니다. 그런 다음 다음을 사용할 수 있습니다.
$ for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done
sed에 대한 옵션을 생성합니다. 이제 eval과 함께 사용할 수 있습니다. 파일 이름이 test라고 가정해 보겠습니다. 우리는 사용:
$ eval "sed" $(for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done) "test"
답변4
paste -d : fileA fileB | sed 's/\([^:]*\):\([^:]*\)/s%\1%\2%/' > sed.script
sed -f sed.script SOURCE-FILE
SOURCE-FILE
개별 파일일 수도 있고 여러 파일일 수도 있습니다. fileA 및 fileB의 텍스트에는 콜론이나 퍼센트 문자를 포함할 수 없지만 공백 문자는 포함할 수 있습니다.