sed를 사용하여 줄 끝을 감지하는 방법

sed를 사용하여 줄 끝을 감지하는 방법

를 사용하여 마지막 문자가 개행인 경우에만 교체를 수행하는 방법을 찾고 있습니다 sed.

예를 들어:

lettersAtEndOfLine

교체되었지만 이는 다음이 아닙니다.

lettersWithCharacterAfter&

개행 문자를 잘 처리하지 못하기 때문에 sed다음과 같이 작동하지 않습니다.

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

이것이 어떻게 달성될 수 있습니까?

답변1

표준을 사용 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

그것은 맛의 문제입니다.

답변2

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

게시한 (깨진) 코드 조각을 보면 개행 문자도 교체하려는 것 같습니다. 이 경우 정규식 고정 자체는 도움이 되지 않습니다. 해결책은 다음과 같습니다.

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

분할:

  • /[a-zA-Z]\+$/{}중괄호 안에 있는 내용을 정규식과 일치하는 줄에 적용한다는 뜻입니다.
  • 정규식은 아래와 같이 고정된 정규식을 사용합니다.당신만의 대답, 취하도록 수정됨글렌 잭맨의 코멘트고려하면.
  • 중괄호 안은 N"활성 버퍼에 다음 줄을 추가"( sed"패턴 공간"이라고 함)를 의미합니다.
  • 마지막으로, 이 s///문은 원하는 대체문입니다. 패턴 공간에 두 개의 연속 라인이 포함되어 있으므로 이제 작동하며 개행 문자도 패턴 공간의 일부입니다.

답변4

줄의 끝을 찾으려면 다음을 사용하십시오.$ 기호:

줄 끝 앵커 없음:

sed -n '/pattern/p' file 

줄 끝 앵커를 사용합니다.

sed -n '/pattern$/p' file

관련 정보