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