sed를 사용하여 목록을 읽고 텍스트 문자열을 바꾸는 방법


1

쉘에서 실행할 sed 스크립트를 만들려고합니다. 두 개의 열이 포함 된 외부 파일에서 UUID 목록을 읽을 수 있어야합니다.

origtexta replacementa
origtextb replacementb
origtextc replacementc

스크립트는 현재 폴더 아래의 모든 txt 파일에서 재귀 적으로 작동해야합니다. 'origtext?'인스턴스를 찾으십시오. 스크립트를 / home / myuser / Scripts /에 저장하고 호출 한 곳 어디에서나 실행할 수 있도록 별칭을 지정하면 스크립트가 좋을 것입니다. 원본 txt 파일을 변경하기 전에 .txt.orig로 저장했습니다.

나는 지금 까지이 비트를 테스트 해왔다.

#!/bin/sed
while read n k; do sed -i 's/$n/$k/g' *.txt; done < list

이 스레드에서 찾은 것 : 문자열 목록을 다른 목록으로 바꾸는 방법

파일의 날짜가 현재 날짜 / 시간으로 변경되기 때문에 무언가를하고있는 것처럼 보이지만 실제로 텍스트가 바뀌지 않으므로이 작업을 수행하는 방법을 전혀 모릅니다.

답변:


2

나는 이것을 위해 bash를 고수 할 것이다. sed 스크립트를 동적으로 빌드

while read uuid uuid_alias; do 
    sed_script+="s/$uuid/$uuid_alias/g;"
done < list

find . -type f -name \*.txt -exec sed -i "$sed_script" '{}' +

시간 효율성을 위해 가능한 한 sed를 몇 번 호출해야합니다.

또한 $ variables는 '작은 따옴표'내에서 확장 되지 않습니다. "큰 따옴표"는 변수 확장을 허용합니다.


내가 이걸 처음 접할 때 나와 함께 견뎌내십시오. 나는라는 파일 uuidrepl.sh하고 실행하기위한 시도로 제할 때, 나는 얻을 : bash는 : ./uuidrepl.sh을 / 빈 / bash는 ^ M 나쁜 통역 : 없음 같은 파일 또는 디렉토리
graphics.guy

텍스트 편집기에서 DOS 스타일 줄 끝 (캐리지 리턴과 줄 바꿈)을 사용하고 있습니다. OS는 줄 바꿈 만 인식하고 캐리지 리턴을 일반 오래된 문자처럼 취급하므로 OS는 "/ bin / bash <CR>"인터프리터 이름을 찾고 해당 파일이 없습니다. Windows에서 스크립트를 편집하는 경우 "Unix 스타일"줄 끝으로 파일을 저장할 수있는 텍스트 편집기를 사용하십시오. 또는 스크립트를 Linux로 전송할 때 dos2unix프로그램을 사용 하여 캐리지 리턴을 제거하십시오.
glenn jackman

흠, 나는 확실하지 않다. 방금 스크립트를 nano로 수동으로 다시 입력했는데 같은 오류가 발생합니다. 이제 우리는 같은 페이지에 무작위 텍스트와 교체 할 샘플 문자열 (test1.txt 및 test2.txt)이있는 두 개의 텍스트 파일, 대체 쌍을 포함하는 '목록'파일 및 헤더 #! / bin / bash 및 코드 블록의 전체 내용을 포함하는 uuidrepl.sh 스크립트.
graphics.guy

나는 오늘 아침에 그것을 다시 보았고, 첫 번째 시도에서 밀려 난 여분의 줄 바꿈이있을 수 있다고 생각합니다. 스크립트를 일부 테스트 파일에서 실행할 수 있었으므로 귀하가 옳았습니다. 고마워요! 이제 교체 시퀀스를 실행하기 전에 원본의 백업을 .txt.orig로 만드는 방법을 알아 내려고합니다.
graphics.guy

가장 간단한 방법 :sed -i.orig ...
glenn jackman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.