sed를 사용하여 개행 문자가 포함된 문자열을 제거하세요.

sed를 사용하여 개행 문자가 포함된 문자열을 제거하세요.

sed를 사용하여 파일에서 특정 문자열을 제거하고 싶습니다.

sed -i 's/mystringtodelete //g'

그러나 이 방법은 문자열에 임의의 개행 문자가 있는 경우에는 작동하지 않습니다. 예를 들면 다음과 같습니다.

내 거

영화

게토델

누구든지 해결책을 알고 있습니까?

답변1

s 명령의 정규식 에서 문자열의 각 개행 문자를 \n다음과 같이 변환해야 합니다.

s/my\n\nstrin\n\ngtodel\n\nete\n//g

\n실제로 패턴의 일부인지 여부에 관계없이 마지막 항목에 특별한 주의를 기울이십시오 .

그런 다음 이 도구 sed는 줄 기반 도구이므로 기본적으로 모든 입력에 명령을 적용한다는 것을 기억하십시오.철사차례로 입력에 나타나는 모든 개행 문자(개행 문자)는 "입력 행" 역할을 합니다.

따라서 개행 문자가 포함된 패턴을 일치시켜야 하는 경우 이를 명시적으로 표시해야 합니다 sed.

대안은 -zNUL 문자(바이너리 0x00)를 줄 구분 기호로 사용하도록 하는 옵션을 사용하는 것입니다. 그러나 입력 데이터가 다음과 같은 경우에는 이 작업을 수행할 수 없습니다.반품NUL을 포함합니다.

귀하의 입력이아니요NUL이 포함되어 있고 sed 실제로 이 옵션이 있는 경우 위의 명령을 -z사용하면 모든 설정이 완료됩니다.ssed -z

모든 입력을 처리할 수 있는 대안은 기본적으로 sed "예약된 공간"에 라인을 추가한 다음 해당 메모리 영역에 패턴을 적용하는 것입니다.

일부 구현에서는 공간을 예약하기 위한 공간이 제한되어 있으므로 주소를 사용하여 대체가 적용되는 입력 범위를 좁힐 수 있다면 sed더 나을 수 있습니다 . sed그렇지 않으면 전체 입력을 읽고 그것이 지역에 맞기를 바라야 합니다. 그러나 예를 들어 GNU에는 sed제한이 없으므로 일반 Linux 시스템을 사용하는 경우에는 문제가 없습니다.

입력 범위를 좁힐 수 없다고 가정하면(즉, 문자열이 입력의 어느 위치에나 나타날 수 있음) sed적합한 명령은 다음과 같습니다.

cat input_file | sed -ne '1h;1!H;${x;s/my\n\nstrin\n\ngtodel\n\nete\n//g;p}'

세분화된 sed명령은 다음과 같습니다.

1h;     # *copy* first line to hold-space
1!H;    # *append* all non-first lines (i.e. all lines after the first) to hold-space
${x;    # at the end of input move hold-space into regular pattern-space
  s/my\n\nstrin\n\ngtodel\n\nete\n//g;  # then apply substitution
  p}    # and print the resulting text

관련 정보