파일에 변경 사항을 저장하지 않고 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개의 이름 회사가 모두 하나 이상의 문자로 구분되고 국가는 항상 대문자이고 모든 회사는 적어도 하나의 소문자를 포함한다고 가정합니다. \\즉, 회사는 국가의 하위 문자열이 될 수 없습니다.

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 "#"}

필드가 2개 이상인 경우 회사 이름 사이 NF>1를 분할 \\?하고 인쇄할 때 공백인지 확인하려고 하므로 ?마지막 필드의 첫 번째 문자를 제거하고 공백으로 바꿉니다.

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

그리고 인쇄하세요

;1' file1

관련 정보