이 패턴을 내부의 개행 문자로 바꾸려면 어떻게 해야 합니까? [복사]

이 패턴을 내부의 개행 문자로 바꾸려면 어떻게 해야 합니까? [복사]

다음을 포함하는 텍스트 파일이 있는 경우:

 someline
 <!--\
      file first read on 2015/01/11

"on" 이후의 모든 항목을 제거하고 싶습니다 <!--\. 어떻게 해야 합니까? 위의 예에서 예상되는 출력은 다음과 같습니다.

someline
2015/01/11

나는 날짜를 추출하는 패턴을 만들 수 없습니다. 그 이유는 2015/01/11그것이 단지 Sunday또는 Yesterday거의 다른 것일 수 있기 때문입니다. read무엇이든 될 수 있습니다. 나는 BSD로 시도했다 sed:

sed 's/<!--\
     file first .* on//g'

하지만 이 명령을 실행하면 다음 오류가 발생합니다.

sed: 1: "s/<!--\
        file f ...": unterminated substitute pattern

그래서 백슬래시 이스케이프를 시도했지만 <동일한 !"종료되지 않은 대체 패턴" 오류가 발생합니다. 나는 GNU sed 설치를 시도하고 동일한 작업을 수행했지만 을 제외하고 \n도 시도했지만 gsed 's/<!--:a;N;$!ba;s/\n/file first .* on//g'다음과 같은 결과를 얻었습니다.

gsed: -e expression #1, char 22: unknown option to `s'

이걸 할 수 없나요 sed? 그렇지 않은 경우 다른 도구/언어를 사용하여 어떻게 이 작업을 수행할 수 있습니까?

답변1

POSIX적으로:

$ sed -e '/<!--/{
  $!N
  s/.*on //
}' <in >out

답변2

다음 sed명령은 원하는 작업을 수행해야 합니다.

sed '/^<!--/{N; s/.*on *//}' inputfile

<!--먼저 줄 시작 부분에서 정규식을 검색한 다음 N명령을 사용하여 다음 줄을 추가하고 "on"까지의 모든 항목을 제거(실제로는 아무것도 바꾸지 않음)합니다.

sed어떤 사람들은 예를 들어 명령에 대문자를 사용할 때마다 N잘못된 도구를 사용하고 있다고 주장합니다.

답변3

Perl은 개행 문자 와도 일치할 수 있는 -0777수정자를 사용하여 전체 파일을 읽을 수 있습니다 ./s.

perl -0777 -pe 's/<!--\\.*?on //gs'

*?"검소한 별표"는 "0번 이상 반복하지만 가능한 가장 짧은 문자열과 일치함"을 의미합니다.

관련 정보