를 사용하여 마지막 문자가 개행인 경우에만 교체를 수행하는 방법을 찾고 있습니다 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