텍스트 파일이 있다고 가정해 보겠습니다.
foo fnord bar
bizz foo poit
이제 "foo"와 "bar"를 모두 "narf"로 바꾸고 싶습니다.
다음을 사용할 수 있다는 것을 알고 있습니다.
sed -e 's/foo/narf/g' -e 's/bar/narf/g' fileName
그러나 OR 연산자를 사용하여 정규 표현식에 두 개의 바늘을 하나의 표현식과 일치시키도록 하고 싶습니다.
몇 가지 매뉴얼을 보고 배관이 내 필요에 적합하다고 생각했지만 시도해 보았습니다.
sed -e 's/foo|bar/narf/g' -i fileName
작동하지 않으며 오류도 발생하지 않습니다.
내가 여기서 뭘 잘못하고 있는 걸까?
답변1
-r
확장 정규식 구문을 사용하는 옵션:
sed -r -e 's/foo|bar/narf/g'
그렇지 않으면 다음과 같이 분리를 탈출하십시오 \|
.
sed -e 's/foo\|bar/narf/g'
답변2
다양한 변형이 있습니다정규식통사론. Unix 세계에서 정규식을 사용하는 첫 번째 도구에는 정규식의 모든 기능이 없었고 문자 집합( […]
및 .
), 반복( *
) 및 줄 앵커( ^
및 $
)만 있었습니다.기본 정규식이런 연산자만 있습니다. Sed는 기본 정규식을 사용하는 구식 도구입니다.
많은 sed 구현에는 전체 정규식 일치를 위한 확장 기능이 있습니다. 문자는 자신을 나타내므로 교대 |
에 사용해야 하며 그룹화 에도 유사하게 사용해야 합니다 . 참고하시기 바랍니다,\|
\(
\)
POSIX 표준\|
지원이 필요하지 않습니다기본 정규식, 일부 시스템(예:오픈BSD) 없이.
sed의 일부 버전에는 다음으로 전환할 수 있는 옵션이 있습니다.확장 정규식, (…)
그룹화 및 |
교대에 사용됩니다. GNU sed(예: Linux 또는 Cygwin에서)를 사용하거나바쁜 상자, -r
옵션 전달. 존재하다FreeBSD또는OSX, -E
옵션 전달.
sed가 교대되지 않는 경우 에 전화할 수 있습니다 awk
. 그것은 출신이다POSIX이지만 이 작업에서는 약간 장황하며 역참조를 지원하지 않습니다.
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
그런데 GNU와 Busybox sed만이 파일 내부 교체를 지원합니다. awk와 다른 버전의 sed는 그렇지 않습니다. 바라보다파일을 제자리에서 "잘라내기"로 변경할 수 있나요?
Perl을 사용하는 경우 일반적으로 모든 도구 크기에 맞게 한 줄의 텍스트를 편리하게 처리합니다. sed, awk 등의 간단한 작업 대부분은 Perl에서는 어렵지 않으며 단일(복잡한 경우) 도구만 배우면 문제를 해결할 수 있습니다.
perl -i -pe 's/foo|bar/narf/g' fileName
답변3
Ex 모드에서 Vim을 사용할 수 있습니다:
ex -sc '%s/\vPA|QU/RO/g|x' file
%
모든 행 선택s
바꾸다\v
마법을 켜세요g
전역 교체x
저장하고 닫습니다