我正在尝试使用sed命令替换文件中的特殊字符。字符%>
用替换]
。sed -r s/\%>\/\]\/g
我正在使用,但出现此错误bash: /]/g: No such file or directory
,看起来sed不喜欢它。
为了补充Avinash Raj的正确和有用的答案:
由于您使用的是整体未用引号引起来的字符串(无论是单引号还是双引号),因此通过在命令中\
转义各个字符可以使您处在正确的轨道上sed
。
但是,您忽略了\
-quote >
,这是导致您出现问题的原因:
>
是外壳的所谓元字符之一s/\%>\/\]\/g
被错误地分为2个参数>
:
s/\%
被传递给sed
-as s/%
,因为外壳程序删除了\
实例(称为quote remove的过程)。
sed
命令,但是甚至没有起作用-参见下文。>\/\]\/g
由shell(bash
)解释,因为它以output-redirection运算符开头>
;除去引号后,shell会看到>/]/g
,尝试打开文件 /]/g
进行写入,但失败了,因为系统]
的根目录中没有子目录。bash
尝试在运行命令之前打开重定向指定的输出文件,并且如果无法打开文件,则不运行命令-这是在这里发生的情况:
bash
抱怨目标目录不存在,命令中止处理-sed
甚至从未调用过。结果:
\
-quote:
| & ; ( ) < > space tab
* ? [
sed
,你需要添加一个引用的额外层; 例如,要指示在正则表达式中sed
使用文字 .
,您必须传递\\.
-两个反斜杠-这样才能sed
正确转义\.
。sed
,因为它可以确保按原样将字符串传递给sed
。让我们将您的命令的有效版本与Avinash Raj的答案的版本进行比较(-r
为简洁起见,省略了以下内容):
sed s/\%\>\/\]\/g # ok - all metachars. \-quoted, others are, but needn't be quoted
sed s/%\>/]/g # ok - minimum \-quoting
sed 's/%>/]/g' # simplest: single-quoted command
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句