And*_*rea 97 text-editing bash regex sed
我需要用替换来替换文本文件中的一些文本。通常我会做类似的事情
sed -i 's/text/replacement/g' path/to/the/file
Run Code Online (Sandbox Code Playgroud)
问题是text和replacement都是包含破折号、斜线、黑斜线、引号等的复杂字符串。如果我转义所有必要的字符text,东西很快就会变得不可读。另一方面,我不需要正则表达式的强大功能:我只需要按字面意思替换文本即可。
有没有办法在不使用某些 bash 命令的正则表达式的情况下进行文本替换?
编写一个执行此操作的脚本会相当简单,但我认为应该已经存在一些东西。
nik*_*nik 17
当您不需要正则表达式的强大功能时,请不要使用它。那没关系。
但是,这并不是真正的正则表达式。
sed 's|literal_pattern|replacement_string|g'
Run Code Online (Sandbox Code Playgroud)
因此,如果/是您的问题,请使用|并且您无需逃避前者。
PS:关于评论,另请参阅有关Escape a string for sed search pattern 的Stackoverflow 答案。
更新:如果你能很好地使用Perl试试看\Q,\E像这样,
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
Run Code Online (Sandbox Code Playgroud)
@RedGrittyBrick 在此处或此处的评论中也提出了类似的具有更强 Perl 语法的技巧
Now*_*ker 16
export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file
Run Code Online (Sandbox Code Playgroud)
这是这里唯一 100% 安全的解决方案,因为:
sed)}字符,它不会中断(因此,优于提交的 Perl 解决方案)ENV['FIND']使用的是,而不是$FIND. 使用$FINDRuby 代码内联的 或 您的文本,如果您的字符串包含未转义的'.Der*_*eit 11
该replace命令将执行此操作。
https://linux.die.net/man/1/replace
原地变化:
replace text replacement -- path/to/the/file
Run Code Online (Sandbox Code Playgroud)
到标准输出:
replace text replacement < path/to/the/file
Run Code Online (Sandbox Code Playgroud)
例子:
$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi
Run Code Online (Sandbox Code Playgroud)
该replace命令随 MySQL 或 MariaDB 提供。
您可以自动将模式转换为其转义形式。像这样:
keyword_raw=$'1\n2\n3'
keyword_regexp="$(printf '%s' "$keyword_raw" | sed -e 's/[]\/$*.^|[]/\\&/g' | sed ':a;N;$!ba;s,\n,\\n,g')"
# keyword_regexp is now '1\/2\/3'
replacement_raw=$'2\n3\n4'
replacement_regexp="$(printf '%s' "$replacement_raw" | sed -e 's/[\/&]/\\&/g' | sed ':a;N;$!ba;s,\n,\\n,g')"
# replacement_regexp is now '2\/3\/4'
echo $'a/b/c/1\n2\n3/d/e/f' | sed -e "s/$keyword_regexp/$replacement_regexp/"
# the last command will print 'a/b/c/2\n3\n4/d/e/f'
Run Code Online (Sandbox Code Playgroud)
该解决方案的积分如下: /sf/ask/28526641/
注意1:这只适用于非空关键字。sed ( ) 不接受空关键字sed -e 's//replacement/'。
注2:不幸的是,我不知道有哪个流行工具不会使用 regexp-s 来解决问题。您可以用 Rust 或 C 编写这样的工具,但默认情况下不存在。
| 归档时间: |
|
| 查看次数: |
38308 次 |
| 最近记录: |