sed 검색은 대소문자를 구분하지 않습니다.

sed 검색은 대소문자를 구분하지 않습니다.

유닉스 스크립트에는 다음 줄이 있습니다

sed -i "/$1/s/a/b" filename

이는 문자열 $1(스크립트의 인수로 제공됨)이 포함된 줄을 찾아 해당 줄에서 "a"를 "b"로 바꿉니다.

나는 $1이 대소문자를 구분하지 않기를 원합니다. 예를 들어, $1이 "foo"인 경우 "foo", "FOO" 또는 "Foo" 등을 포함하는 모든 행에서 교체가 발생하기를 원합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?

(참고: 이 게시물의 원본 버전에서는 코드의 첫 번째 슬래시가 생략되었습니다. 이는 Kusalananda의 답변을 이해하는 데 중요한 맥락입니다.)

답변1

나는 귀하의 원래 sed표현이 해당 초기 문자 /$1/s/a/b/이거나 포함되어 있다고 가정합니다. 그렇지 않으면 초기 문자를 포함 해야 합니다 (참고: 질문의 표현은 이 글이 작성된 이후 수정되었습니다). 이 명령은 첫 번째 위치 인수가 제공하는 특정 정규식으로 주소가 지정된 모든 행에 대체를 적용합니다 ./$1/ s/a/b//$1/sed$1

GNU 및 macOS sed에서 사용 가능한 일부 구현에서는 플래그가 명령( 예: ) 과 함께 사용되는 방식과 유사한 방식으로 (대문자 i) 플래그를 사용하여 정규식 주소가 대/소문자를 구분하지 않고 일치하도록 할 수 있습니다 .sedsedIs///s///g

sed이 비표준 기능을 지원하는 기능을 사용한다고 가정하면 다음과 같습니다 .

sed "/$1/I s/a/b/" file

a그러면 b첫 번째 줄이 대소문자를 구분하지 $1않고 정규식과 일치하는 모든 줄로 대체됩니다.

시험:

% set -- foo ; sed "/$1/I s/a/b/" <<'EXAMPLE'
heredoc> FOO a
heredoc> a foo a
heredoc> Fool abba
heredoc> Moose able
heredoc> EXAMPLE
FOO b
b foo a
Fool bbba
Moose able

답변2

알겠습니다. 알겠습니다. 일 Is보다는 . s따라서 고정 코드는 다음과 같습니다.

sed -i "/$1/Is/a/b" filename

(이것은 t-shell에서 작동합니다. 아직 테스트하지 않았습니다.)

관련 정보