답변:
standard sed
를 사용하면 파일에서 읽은 텍스트에 줄 바꿈 이 표시 되지 않습니다 . sed
한 줄씩 읽기 때문에 현재 행의 텍스트 끝에 sed
패턴 공간에 줄 바꿈 이 없기 때문 입니다. 다시 말해, sed
줄 바꿈으로 구분 된 데이터를 읽고 구분 기호는 sed
스크립트가 보는 내용의 일부가 아닙니다 .
정규 표현식은 줄의 끝에 또는를 사용 $
하여 시작 부분에 고정 할 수 있습니다 ^
. 줄의 시작 / 끝에 표현식을 고정하면 줄의 아무 곳이 아니라 정확하게 일치하도록 강제합니다.
[A-Za-z]*
줄 끝의 패턴 과 일치하는 것을 다른 것으로 바꾸려면 다음과 같이 패턴을 고정하십시오.
[A-Za-z]*$
... 줄 끝과 다른 곳에서 강제로 일치시킵니다.
그러나 아무[A-Za-z]*$
것도 일치 하지 않기 때문에 (예 : 모든 줄 의 끝에 빈 문자열이있는 경우 ) 다음 과 같이 지정하여 무언가 를 강제로 일치시켜야합니다.
[A-Za-z][A-Za-z]*$
또는
[A-Za-z]\{1,\}$
따라서 sed 명령 줄은
$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt
-E
스위치가 필요하지 않기 때문에 여기 에서 스위치를 사용하지 않았습니다 . 그것으로, 당신은 쓸 수 있었다
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
맛의 문제입니다.
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
또는 길고 복잡한 불필요한 방법 :
나는 tr의 도움으로 여전히 sed를 사용 하여이 작업을 수행 할 수 있음을 알았습니다. 줄의 끝을 나타내는 다른 문자를 지정할 수 있습니다. 이 경우 "`"와 같은 다른 임시 문자를 사용해야합니다. "~"를 사용하여 줄의 끝을 나타냅니다.
tr '\n' '`' <input.txt >output.txt sed -i "s/`/~`/" output.txt tr '`' '\n' <output.txt >result.txt
그런 다음 실제 검색 및 바꾸기를 수행하려면 "\ n"대신 "~"를 사용하십시오.
sed -i -E "s/[a-zA-Z]*~/replace/" result.txt
그런 다음 다른 줄에서 추가 문자를 정리하십시오.
sed -i "s/~//" result.txt
분명히 이것은 모두 함께 연결되어 다음과 같은 결과를 낳을 수 있습니다.
tr '\n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' '\n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt
$
? 예s/[a-zA-Z]*$/replace/
\+
대신 더 나은 방법을 사용 합니다. 2) 캐릭터 클래스를 사용할 수 있습니다 . 그래서 :*
[[:alpha:]]
sed 's/[[:alpha:]]\+$/replace/' file
게시 한 (깨진) 코드 스 니펫에서 줄 바꿈도 바꾸려는 것 같습니다. 이 경우 정규식 앵커 자체로는 도움이되지 않습니다. 다음은 해결책입니다.
sed '/[[:alpha:]]\+$/{N;s/[[:alpha:]]\+\n/replace/}' your_file
세분화 :
/[a-zA-Z]\+$/{}
curles 안에 오는 모든 것을 정규식과 일치하는 줄에 적용하는 것을 의미합니다. N
"활성 버퍼에 다음 줄 추가"( sed
'패턴 공간'이라고 함)s///
진술은 당신의 필수 대체입니다. 이제 패턴 공간에 두 개의 연속적인 선이 포함되어 개행이 그 일부이기 때문에 이제 작동합니다.