다음을 포함하는 텍스트 파일이 있는 경우:
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번 이상 반복하지만 가능한 가장 짧은 문자열과 일치함"을 의미합니다.