![이 패턴을 내부의 개행 문자로 바꾸려면 어떻게 해야 합니까? [복사]](https://linux55.com/image/82054/%EC%9D%B4%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EB%82%B4%EB%B6%80%EC%9D%98%20%EA%B0%9C%ED%96%89%20%EB%AC%B8%EC%9E%90%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음을 포함하는 텍스트 파일이 있는 경우:
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번 이상 반복하지만 가능한 가장 짧은 문자열과 일치함"을 의미합니다.