반응형

sed 에서 2개 이상 검색으로 찾고 제일 마지막 조건에 매칭되는 문자열로 변환하는 방법?

sed에서는 여러 검색 조건을 동시에 사용할 수 있습니다. 이를 위해서는 각 검색 조건을 별도의 표현식으로 나타내고 이를 쉼표(,)로 구분하면 됩니다. 예를 들어, 파일에서 "apple"과 "orange"이라는 단어가 포함된 모든 라인에서 "fruit"으로 치환하고 싶은 경우 다음과 같이 사용할 수 있습니다.

sed -e '/apple.*orange/ s/.*/fruit/' filename.txt

위 예제에서, `/apple.*orange/`은 "apple"과 "orange"이라는 두 단어가 함께 포함된 라인을 찾는 검색 조건입니다. `s/.*/fruit/`는 해당 라인 전체를 "fruit"으로 치환합니다.

만약 "apple"과 "orange"이라는 단어가 각각 따로 있는 라인에서 "fruit"으로 치환하고 싶다면, 다음과 같이 두 개의 검색 조건을 사용하면 됩니다.

sed -e '/apple/ {/orange/ s/.*/fruit/}' filename.txt

위 예제에서, `/apple/`은 "apple"이 포함된 라인을 찾는 검색 조건입니다. 중괄호({}) 안에는 해당 라인에서 다른 검색 조건 `/orange/`을 추가하고, 그 라인을 "fruit"으로 치환하는 명령어가 포함됩니다.

이 방법으로는 두 개 이상의 검색 조건을 동시에 사용하고, 맨 마지막에 매칭되는 문자열로 치환할 수 있습니다.

---

  • ChatGPT로부터 답변 받음
  • answered by ChatGPT
반응형
반응형

출처

https://unix.stackexchange.com/questions/295274/grep-to-find-the-correct-line-sed-to-change-the-contents-then-putting-it-back

수정할 라인을 grep으로 찾고, 내용을 sed로 바꾼 뒤 원래 파일에 적용하는 방법?

저는 파일에서 특정 라인에 한 단어를 바꾸려고 합니다만 이 모두를 연결하는데 몇가지 문제가 있습니다.

기본적으로 제 파일의 한 라인은 키워드 'firmware_revision'이며 이 라인에서만 'test' 단어를 'production'으로 변경하고 싶습니다.

저는 이렇게 해 보았습니다.

grep 'firmware_revision' myfile.py | sed 's/test/production'

이 방법으로 제가 원하는 라인을 선택하여 대체를 실행할 수 있겠지만, 이전 줄을 대체하기 위해 새 줄을 원본 파일로 적용하는 방법은 알 수 없습니다. 분명히 파일로 다시 redirection할 수는 없습니다. 어떻게 해야 할까요?

임시 파일을 사용하더라도 grep을 사용하여 필요한 줄만 가져 오면 파일의 다른 모든 데이터가 손실되므로 더 이상 모든 데이터를 임시 파일로 리디렉션 한 다음 원본을 임시 파일로 바꿀 수 없습니다.

편집-누군가가 추가 정보를 요청했습니다.

다음과 같은 줄로 가득 찬 파일이 있다고 가정해 봅시다.

[
  ('key_name1', str, 'value1', 'Description'),
  ('key_name2', str, 'value2', 'Description'),
  ('key_name3', str, 'value3', 'Description'),
  ('firmware_revision', str, 'my-firmware-name-test', 'Firmware revision name')
]

이제 'firmware_revision'이 포함된 줄을 찾고 해당 줄에서 'test'라는 단어의 모든 인스턴스를 'production'으로 변경하는 스크립트 (이상적으로는 한 줄짜리)를 작성하고 싶습니다. '테스트'라는 단어는 해당 파일의 다른 위치에 있을 수 있으며 변경하지 않기를 바랍니다. 명확하게 하기 위해 위의 줄을 다음과 같이 변경하고 싶습니다.

('firmware_revision', str, 'my-firmware-name-production', 'Firmware revision name')

어떻게 해야 합니까?


2개 답변 중 1개

다음을 시도해 보세요.

sed -i.bak '/firmware_revision/ s/test/production/' myfile.py

여기 /firmware_revision/은 조건처럼 작동합니다. 정규식 firmware_revision과 매칭되는 라인이면 true(참) 이고 다른 라인에 대해서는 false(거짓)입니다. 조건이 true이면 다음 명령이 실행됩니다. 이 경우, 저 명령은 testproduction으로 처음 나왔을 때 대체하는 명령입니다.

다른 말로, 명령어 s/test/production/firmware_revision의 정규식과 매칭되는 라인에서만 실행됩니다. 모든 다른 라인은 변경되지 않고 지나갑니다.

기본적으로 sed는 표준출력으로 그것을 보냅니다. 하지만, 당신이 파일에 변경사항을 적용하고 싶다면, -i 옵션을 추가할 수 있습니다. 특별히, -i.bakbak 확장자로 지정된 백업 복사본으로 파일이 변경 되도록 합니다.

명령이 작동한다고 결정하고 위험하게 백업을 생성하지 않으려면 GNU sed (Linux)를 사용하여 다음을 사용하십시오.

sed -i '/firmware_revision/ s/test/production/' myfile.py

반면, BSD (OSX)에서는 -i 옵션은 argument를 가져야 합니다. 만약 백업을 남겨놓지 않길 바라면, 비어있는 argument를 제공해야 합니다. 다음처럼 사용하십시오.

편집

질문에 대한 편집에서 OP는 라인의 모든 test 발생이 production으로 대체 되도록 요청합니다. 이 경우 전역 (해당 행) 대체를 위해 대체 명령에 g 옵션을 추가합니다.

sed -i.bak '/firmware_revision/ s/test/production/g' myfile.py
반응형
반응형

출처

https://stackoverflow.com/questions/10856447/sed-command-find-and-replace-in-even-lines-of-a-file


sed에서 파일의 짝수 줄만 찾아 치환하는 명령

저는 이 stackoverflow에서 신입입니다. 저는 SED를 사용하여 파일의 짝수 줄만 표현식으로 치환하고 싶습니다. 제 문제는 원래 파일의 변화는 원래 파일에서 변한 내용을 저장하는 방법을 생각할 수 없다는 점입니다. (예: 파일에서 변한 내용을 덮어쓰는 방법) 저는 다음을 시도해 보았습니다.

sed -n 'n;p;' filename | sed 's/aaa/bbb/'

하지만 이는 변한 내용을 저장할 수 없습니다. 이에 대한 당신의 도움에 감사드립니다.

------

4개의 답변 중 1 개의 답변만 추려냄.

다음을 시도하세요.

sed -i '2~2 s/aaa/bbb/' filename

-i 옵션은 sed에게 해당 filename에서 작동하도록 표준출력(stdout)으로 수정된 버전을 쓰지 않고 즉 원래 파일을 나두지 않고 파일의 변경 내용을 적용하도록 합니다. 2~2부분은 명령어를 통해 적용되어야 할 sed의 줄(라인)에 대한 주소입니다. 2~2는 짝수 줄만 편집(수정)함을 의미합니다. 1~2는 홀수 줄만 편집(수정)함을 의미합니다. 5~6는 6줄마다 편집(수정)하고 5번째 줄부터 시작합니다.

-- 역자 추가 내용--

참고주소

https://www.gnu.org/software/sed/manual/html_node/Addresses.html


반응형

+ Recent posts