我正在尝试使用sed命令替换文件中的特殊字符。
由%>
替换的字符为]
。
我正在使用sed -r s/\%>\/\]\/g
,但我有这个错误bash: /]/g: No such file or directory
,看起来像是不喜欢它。
答案 0 :(得分:4)
将您的sed代码放在引号内,并添加您想要使用的文件路径,最后不要转义sed分隔符。
$ echo '%>' | sed 's/%>/]/g'
]
即
sed 's/%>/]/g' file
答案 1 :(得分:2)
补充Avinash Raj's correct and helpful answer:
由于您使用的是整体未加引号的字符串(既不是单引号也不是双引号),因此您\
处于正确的轨道上 - 在sed
中转义个别字符}命令。
然而,您忽略了\
- 引用>
,这是导致您出现问题的原因:
>
是shell之一的所谓元字符 s/\%>\/\]\/g
被>
错误地拆分为 2 参数:
s/\%
传递给sed
- s/%
,因为shell会删除\
个实例(名为 quote removal 的进程)。
sed
命令,但它甚至没有发挥作用 - 见下文。>\/\]\/g
由 shell (bash
)解释,因为它以输出重定向运算符>
开头;删除引号后,shell会看到>/]/g
,尝试打开文件 /]/g
进行写入,但失败,因为您的系统没有名为{{1的子目录在其根目录中。]
尝试在运行命令之前打开由重定向指定的输出文件,如果无法打开文件,则不会运行命令 - 这就是这里发生的事情:
bash
抱怨不存在的目标目录和命令的中止处理 - bash
甚至从未被调用。<强>结果是:强>
sed
- 引用:
\
| & ; ( ) < > space tab
* ? [
引用(转义)字符,则需要添加额外的引用层;例如,为了指示sed
在正则表达式中使用文字 sed
,您必须传递.
- 两个反斜杠 - 以便\\.
看到正确转义的sed
。\.
命令周围使用单引号要简单得多,因为它确保传递字符串< em>就像到sed
。让我们将您的命令的工作版本与Avinash Raj's answer中的版本进行比较(为简洁起见,省略sed
):
-r
答案 2 :(得分:1)
我不确定我是否正确地提出了问题。如果您想要%
替换>
或]
,则此处不需要sed
。在这种情况下使用tr
:
tr '%>' ']' < input.txt
如果您想用%>
替换序列]
,那么@AvinashRaj所示的sed
命令就是您的选择。