![많은 문자열을 다른 문자열로 교체](https://linux55.com/image/165283/%EB%A7%8E%EC%9D%80%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%8B%A4%EB%A5%B8%20%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C%20%EA%B5%90%EC%B2%B4.png)
권한이 필요한 특정 명령을 무시하고 쉘 스크립트를 실행하고 싶습니다. 명령은 다음과 같습니다 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 명령과 동일합니다.|
x
s/[abm|]/x/g
y/abm|/xxxx/
tr
tr '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 -E
POSIX 표준의 다음 주요 버전에서 지정될 가능성이 높습니다.그러나 결국에는 대부분의 구현으로 확산될 것입니다.