하나의 표현으로 여러 개의 바늘을 찾아 바꾸는 방법은 무엇입니까?

하나의 표현으로 여러 개의 바늘을 찾아 바꾸는 방법은 무엇입니까?

텍스트 파일이 있다고 가정해 보겠습니다.

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
  1. %모든 행 선택

  2. s바꾸다

  3. \v마법을 켜세요

  4. g전역 교체

  5. x저장하고 닫습니다

관련 정보