다음과 같은 파일이 있습니다.
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
일치하는 첫 번째 줄 (즉, 포함 )부터 마지막 줄( )까지 모든 줄에서 대체 명령을 실행합니다 .optype
optype
$
유사한 줄이 존재하는 경우 해당 줄 --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
--DELETE
ostype ?
이렇게 하면 각 "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
원본 파일을 덮어쓸 수 있습니다.