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