다른 줄의 패턴 발생을 기반으로 줄의 주석 처리를 제거합니다.

다른 줄의 패턴 발생을 기반으로 줄의 주석 처리를 제거합니다.

다음과 같은 파일이 있습니다.

File1:

json ABC
optype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK

위 어디에든 패턴 optype이 있으면 DELETE로 시작하는 줄의 주석 처리를 제거하고 싶습니다.

원하는 출력:

json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK

파일에 위의 모드 optype이 없으면 수정이 필요하지 않습니다.

File2:

json ABC
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK    

원하는 출력:

json ABC
json XYZ
json IJK
--DELETE OP_TYPE     
json IJK

또는를 통해 awk이를 달성하는 방법은 무엇입니까 sed?

답변1

그리고 sed:

sed '/optype/,$ s/^--\(DELETE\)/\1/'

정규식과 s일치하는 첫 번째 줄 (즉, 포함 )부터 마지막 ​​줄( )까지 모든 줄에서 대체 명령을 실행합니다 .optypeoptype$

유사한 줄이 존재하는 경우 해당 줄 --DELETE optype은 범위의 시작으로 간주되며 주석 처리되지 않습니다.

동등한 perl:

perl -pe 's/^--(?=DELETE)// if /optype/..0'

또는 awk:

awk '/optype/, 0 {sub("^--DELETE", "DELETE")}; {print}'

답변2

--DELETE...각각의 문제가 발생한 후에 이를 조작 하고 싶다고 가정하면 optype ?이 GNU를 사용할 수 있습니다 sed.

$ sed -E '/^optype/{:a;n;s/^--(DELETE)/\1/;ba}' input_file

--DELETE...이렇게 하면 로 시작하는 줄 뒤의 모든 항목이 편집됩니다 ostype ?. 이것이 예상된 동작이 아니고 그 이후의 첫 번째 항목만 편집하려는 경우 ostype ?이 GNU를 사용할 수 있습니다.sed

$ sed -E '/^optype/{:a;t;n;s/^--(DELETE)/\1/;ba}' input_file
json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK

--DELETEostype ?이렇게 하면 각 "ostype" 뒤에 나타나는 주석 수에 관계없이 각 발생 후 주석이 제거됩니다.

답변3

펄 방법:

perl -pe '$k++ if /optype/; s/^--(?=DELETE)// if $k' file2

행이 일치하면 변수의 값이 증가하고 optype, 변수가 설정되면 --해당 행으로 시작하는 모든 행에서 제거됩니다. --DELETE구성 ?=긍정적 인 전망.

답변4

이와 같이?

첫 번째그리고작업 유형:

$ cat File1 
json ABC
optype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK
$ awk 'BEGIN{unco=0}{if($0~/optype/){unco=1};if(unco){gsub(/^--/,"")}; print }' File1 
json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK

그리고 아무것도 없습니다:

$ cat File1 
json ABC
ptype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK
$ awk 'BEGIN{unco=0}{if($0~/optype/){unco=1};if(unco){gsub(/^--/,"")}; print }' File1 
json ABC
ptype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK

unco행에 포함된 경우 플래그를 설정합니다 optype.

이 플래그가 설정되면 이후의 모든 줄을 잘라냅니다 --.

우리는 각 줄을 인쇄합니다.

사용하는 경우 GNU awk인라인 기능을 활용하여 파일을 제자리에서 수정할 수 있습니다. 그렇지 않으면 tmp 파일로 리디렉션하고 mv원본 파일을 덮어쓸 수 있습니다.

관련 정보