많은 문자열을 다른 문자열로 교체

많은 문자열을 다른 문자열로 교체

권한이 필요한 특정 명령을 무시하고 쉘 스크립트를 실행하고 싶습니다. 명령은 다음과 같습니다 insmod. 그래서 이 필터 스크립트를 사용했는데 작동했습니다(이 명령은 로 대체되었습니다 true).

sed -e 's/command1/true/g' -e 's/command2/true/g' -e 's/command3/true/g' ... -e 's/commandN/true/g'

이것을 더 간결하게 표현하는 방법이 있나요?

간단한 문자를 사용하여 "a", "b" 및 "m"을 "x"로 변경하려면 다음을 수행할 수 있습니다.

sed -e 's/[abm]/x/g'

또는

tr abm x

(또는 그에 tr abm '[x*]'상응하는 POSIX). 하지만 문자열을 사용하는 것은 어떻습니까?

답변1

비표준 옵션을 사용하여 확장 정규식을 이해할 sed수 있다면 다음을 사용할 수 있습니다.-E

sed -E 's/string1|string2|string3/true/g'

대체는 |일반적으로 지원되는 유형에 대한 기본 정규식에서 지원되지 않는 확장된 정규식 기능입니다 sed.

위의 명령은 sed주어진 세 문자열 중 하나를 대체합니다. 비록 해당 문자열이 다른 문자열의 하위 문자열로 나타나더라도(예: string1에서 string10).

이를 방지하려면 양쪽의 단어 경계도 일치시킵니다.

sed -E 's/\<(string1|string2|string3)\>/true/g'

macOS에서는 단어 경계를 지정하기 위해 [[:<:]][[:>:]]대신 \<및를 사용해야 할 수도 있습니다 .\>


그런데, 귀하의 s/[a|b|m]/x/g표현(이제 질문에서 수정됨)은 a, b및 를 바꿀 뿐만 아니라 m텍스트의 x모든 내용을 . 이는 or 명령과 동일합니다.|xs/[abm|]/x/gy/abm|/xxxx/trtr 'abm|' 'xxxx'tr 'abm|' '[x*4]'

답변2

이것이 당신이 원하는 것입니까? GNU 사용 sed:

sed -E 's/(command1|command2|command3)/true/' file

답변3

POSIXly에서는 다음을 사용할 수 있습니다 awk.

awk '{gsub(/command1|command2|command3/, "true"); print}' < file

(sed -EPOSIX 표준의 다음 주요 버전에서 지정될 가능성이 높습니다.그러나 결국에는 대부분의 구현으로 확산될 것입니다.

관련 정보