다음 줄의 내용을 기반으로 특정 텍스트를 제거하는 명령이 필요합니다. 특히 다음 줄이 "]"인 경우 "쉼표"를 제거하고 다음 줄의 "]"도 제거하고 싶습니다.
예
987678680,
]
123435434-
]
2345643,
]
2345632-
]
234563,
]
1234567654,
]
산출
987678680
123435434-
]
2345643
2345632-
]
234563
1234567654
답변1
이러한 종류의 작업(연속 행이 특정 패턴과 일치하는 경우 편집/수행)을 처리할 때 가장 쉬운 방법은 sed
아마도 다음과 같습니다.N;P;D
주기또한 ~으로 알려진"슬라이딩 윈도우":
sed -e '$!N;s/,\nPATTERN//;t' -e 'P;D' file
이렇게 하면 N
추가 행이 패턴 공간에 배치되고 s
필요에 따라 무조건 교체를 시도합니다. 그런 다음 t
교체가 성공했는지 확인합니다. 그렇다면 스크립트 끝(레이블 없이)으로 분기하여 자동으로 패턴 공간을 인쇄합니다. 그렇지 않으면 패턴 공간의 첫 번째 줄을 P
인쇄 및 D
삭제하고 루프를 다시 시작합니다.
다른암소 비슷한 일종의 영양 sed
방법:
sed ':x /,$/{N;s/,\n]//;T x}' file
이 방법은 후행 쉼표가 짝수 줄에 있는 경우에도 작동합니다. 예:
printf '%s\n' 1, 2, ']' | sed ':x /,$/{N;s/,\n]//;T x}'
산출:
1,
2
작동 방식:
대부분의 프로그래밍 언어에서 주소 태그는 완전히 수동적입니다. 태그는 코드를 표시하지만 해당 코드의 작동을 변경하지 않습니다. 아니요 sed
하지만. 프로그램 시작 부분의 레이블로 점프하면 sed
실제로 코드 작동이 변경되거나 암시적인 오류를 피할 수 있습니다.n
외부선sed
루프가 일반적으로 시작되는 코드입니다.
이것T
실패하면 est 및 분기로 진행합니다.명령은 T x
이전 여부를 확인합니다s
대안이 명령은 아무 작업도 하지 않습니다. 그렇다면 :x
시작 레이블 로 점프합니다.아니요무엇이든 인쇄하거나 새 줄을 읽으세요. 이는 다음을 의미합니다.N
연장선 추가교체되지 않은 항목은 필요한 대로 다시 검색됩니다.
비암소 비슷한 일종의 영양 sed
, ( T
명령을 사용할 수 없고 구문이 덜 완화된 경우) 이식성이 더 높아야 합니다.
sed ':x
/,$/{
N
s/,\n]//
t
b x
}' file
답변2
sed
다음과 같이 사용할 수 있습니다 .
sed -e '/,$/{N; /\]/s/,[^,]*$//;}' file
987678680
123435434-
]
2345643
2345632-
]
234563
1234567654
또는 @steeldriver에 따르면 다음과 같이 단순화할 수 있습니다 Bash
.
sed '$!N; s/,\n]//'