sed로 줄 끝을 감지하는 방법


15

마지막 문자가 개행 문자 인 경우 대체를 실행하는 방법을 찾고 sed있습니다.

예를 들어 :

lettersAtEndOfLine

대체되지만 다음과 같은 것은 아닙니다.

lettersWithCharacterAfter&

sed개행과 잘 작동하지 않기 때문에 간단하지 않습니다.

$ sed -E "s/[a-zA-Z]*\n/replace/" file.txt

이것이 어떻게 이루어질 수 있습니까?

답변:


21

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

맛의 문제입니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Kusalananda

3
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

3
잘 모르겠다 ... 왜 당신은 라인의 끝에 고정되지 않는가 $? 예s/[a-zA-Z]*$/replace/
don_crissti 2016 년

1
2 포인트 : 1) 후자는 문자열 끝에 0 문자를 허용하기 때문에 \+대신 더 나은 방법을 사용 합니다. 2) 캐릭터 클래스를 사용할 수 있습니다 . 그래서 :*[[:alpha:]]sed 's/[[:alpha:]]\+$/replace/' file
글렌 잭맨

@glennjackman 더하기 전의 백 슬래시는 무엇입니까? 추가 문자와 일치하지 않습니까?
Matthew D. Scholefield 2016 년

1
-r옵션 없이 GNU sed 는 이 정규 표현식 구문을 사용 합니다 .
glenn jackman 1

0

게시 한 (깨진) 코드 스 니펫에서 줄 바꿈도 바꾸려는 것 같습니다. 이 경우 정규식 앵커 자체로는 도움이되지 않습니다. 다음은 해결책입니다.

sed '/[[:alpha:]]\+$/{N;s/[[:alpha:]]\+\n/replace/}' your_file

세분화 :

  • /[a-zA-Z]\+$/{} curles 안에 오는 모든 것을 정규식과 일치하는 줄에 적용하는 것을 의미합니다.
  • 정규식은 glenn jackman의 의견 을 고려 하여 수정 된 자신의 답변에 표시된 것처럼 고정을 사용하는 것입니다 .
  • curlies 내부에서 N"활성 버퍼에 다음 줄 추가"( sed'패턴 공간'이라고 함)
  • 마지막으로 s///진술은 당신의 필수 대체입니다. 이제 패턴 공간에 두 개의 연속적인 선이 포함되어 개행이 그 일부이기 때문에 이제 작동합니다.

0

줄 끝을 찾으려면 $ -sign을 사용하십시오 .

줄 끝 앵커없이 :

sed -n '/pattern/p' file 

줄 끝 앵커없이 :

sed -n '/pattern$/p' file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.