텍스트 파일 내의 일부 텍스트를 대체 텍스트로 대체해야 합니다. 보통 나는 다음과 같은 일을 할 것입니다
sed -i 's/text/replacement/g' path/to/the/file
문제는 text
및 둘 다 replacement
대시, 슬래시, 검정 슬래시, 따옴표 등을 포함하는 복잡한 문자열이라는 것입니다. 내부에 필요한 모든 문자를 이스케이프하면 text
빠르게 읽을 수 없게 됩니다. 반면에 정규식의 강력한 기능은 필요하지 않습니다. 텍스트를 문자 그대로 대체하면 됩니다.
텍스트 대체를 할 수 있는 방법이 있나요?없이일부 bash 명령에 정규식을 사용합니까?
이를 수행하는 스크립트를 작성하는 것은 다소 쉽지만 이미 뭔가가 있어야 한다고 생각합니다.
답변1
정규식의 강력한 기능이 필요하지 않으면 사용하지 마세요. 괜찮습니다.
그러나 이것은 실제로는 아닙니다.정규식.
sed 's|literal_pattern|replacement_string|g'
따라서 /
문제가 있는 경우 사용 |
하면 전자를 벗어날 필요가 없습니다.
추신: 의견에 대해서는 이 Stackoverflow 답변도 참조하세요.sed 검색 패턴에 대한 문자열 이스케이프.
업데이트: 잘 사용하고 계시다면펄\Q
이것 저것 시도해 보세요 \E
.
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
@RedGrittyBrick은 또한 댓글에서 더 강력한 Perl 구문을 사용하여 유사한 트릭을 제안했습니다.여기또는여기
답변2
export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file
이것이 유일한 100% 안전한 솔루션입니다. 그 이유는 다음과 같습니다.
- 정규 표현식이 아닌 정적 대체이므로 어떤 것도 이스케이프할 필요가 없습니다(따라서 를 사용하는 것보다 우수함
sed
). - 문자열에 char이 포함되어 있으면 깨지지 않습니다
}
(따라서 제출된 Perl 솔루션보다 우수함). ENV['FIND']
가 아닌 가 사용되었기 때문에 어떤 문자와도 깨지지 않습니다$FIND
. Ruby 코드에 텍스트가 인라인된 경우$FIND
문자열에 이스케이프되지 않은'
.
답변3
명령 replace
이 이를 수행합니다.
https://linux.die.net/man/1/replace
장소 변경:
replace text replacement -- path/to/the/file
표준 출력으로:
replace text replacement < path/to/the/file
예:
$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi
이 replace
명령은 MySQL 또는 MariaDB와 함께 제공됩니다.
답변4
Perl의 메커니즘을 사용하여 \Q
"인용(비활성화) 패턴 메타문자"
perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'