문자열 목록을 다른 목록으로 바꾸는 방법

문자열 목록을 다른 목록으로 바꾸는 방법

교체하고 싶은 문자열이 많은 파일이 있으므로 다음과 같은 간단한 명령을 사용하는 방법을 생각해 보았습니다.

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파일"

이는 fileAfileB라인 수가 동일하고(그리고 해당 숫자는 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의 텍스트에는 콜론이나 퍼센트 문자를 포함할 수 없지만 공백 문자는 포함할 수 있습니다.

관련 정보