파일에 변경 사항을 저장하지 않고 2개의 sed를 병합합니다.

파일에 변경 사항을 저장하지 않고 2개의 sed를 병합합니다.

sed를 사용하여 파일에서 단어와 단어가 포함된 주석 행을 읽고 검색한 다음 저장할 때 \와 같은 특수 기호를 파일에서 제거할 수 있지만 \가 그대로 유지됩니까?

내 말은 회사 이름(2단어)이 포함된 파일이 있고 그 사이에 문자가 있을 수 있으며 원본 파일에서 이러한 기호에 대해 문자 이스케이프(정규 표현식)를 사용한다는 것입니다. 예를 들어

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

\를 아무것도 아닌 것으로 바꾸고 댓글을 달았지만, 저도 예전처럼 \로 저장하고 싶었습니다. 내가 원하는 출력:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

내 스크립트는 다음과 같습니다

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

하지만 \ 없이 저장됩니다. 예, 삭제하지 않고 "Red\\\\ Park"만 검색하면 됩니다. 하지만 이름이 20개라면 2-3 단어로 구성된 각 회사 이름에 \\\\를 입력하고 싶지 않습니다. :) 아니면 다른 비전이 있고 이를 수행하기 위해 (sed 대신) 다른 명령을 사용할 수도 있습니다. ? 나는 내가 원하는 것을 얻기 위해 가능한 모든 제안이나 도움을 받아들입니까? 매우 감사합니다!

답변1

내가 올바르게 이해했다면 이것이 효과가 있는지 살펴보겠습니다.

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

산출:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

답변2

끈기가 미덕이라고 하던데..

\\2개의 이름 회사는 모두 로 구분되고 1개의 문자와 국가는 항상 대문자이며 모든 회사에는 적어도 하나의 소문자가 포함되어 있다고 가정합니다. 즉, 회사는 국가의 하위 문자열이 될 수 없습니다.

해결책 awk(당신이 이 옵션을 지지한다면 -i inplace) 대부분의 사람들이 그럴 것이라고 확신합니다.

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

송곳

awk변경 -i inplace하고 국가 및 회사를 변수로 전달하도록 지시합니다 -v. \\파일 뒤에 알 수 없는 구분 기호가 있으므로 회사 .이름의 두 부분 사이에 사용하세요.

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

필드 구분 기호를 구분으로 설정하면 3개의 필드가 표시되고 다음으로 설정됩니다 \.\\

        OFS="\\"} 

끊어진 부분이 있으면 인쇄할 때 다시 모아 두십시오.

첫 번째 필드가 $1==country일치의 첫 번째 부분인 경우.

회사의 경우 분할하여 \여러 필드로 끝나는 지 확인한 NR>1다음 마지막 2개 필드 또는 분할되지 않은 필드에서 적절하게 테스트하세요.

일치하는 항목이 있는 경우 printf #(즉, 개행 없이 인쇄됨)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

필드가 여러 개인 경우 NF>1회사 이름을 분할하고 \\?인쇄할 때 필드가 공백인지 확인하려면 마지막 필드의 첫 번째 문자를 제거하고 공백으로 바꾸십시오.?

    NF>1{$NF=" "substr($NF,2)

인쇄하고

;1' file1

관련 정보