Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用sed替换特殊字符_Sed - Fatal编程技术网

用sed替换特殊字符

用sed替换特殊字符,sed,Sed,我正在尝试使用sed命令替换文件中的特殊字符。 字符为%>将替换为]。 我正在使用sed-r s/\%>\/\]\/g,但我有一个错误bash:/]/g:没有这样的文件或目录,看起来sed不喜欢它。将您的sed代码放在引号内,并添加您想要使用的文件路径,最后不要转义sed分隔符 $ echo '%>' | sed 's/%>/]/g' ] 即 将sed代码放在引号内,并添加要使用的文件路径,最后不要转义sed分隔符 $ echo '%>' | sed 's/%>/]/g

我正在尝试使用sed命令替换文件中的特殊字符。 字符为%>将替换为]。
我正在使用sed-r s/\%>\/\]\/g,但我有一个错误bash:/]/g:没有这样的文件或目录,看起来sed不喜欢它。

将您的sed代码放在引号内,并添加您想要使用的文件路径,最后不要转义sed分隔符

$ echo '%>' | sed 's/%>/]/g'
]


将sed代码放在引号内,并添加要使用的文件路径,最后不要转义sed分隔符

$ echo '%>' | sed 's/%>/]/g'
]


我不确定我是否答对了这个问题。如果要将%or>替换为],则此处不需要sed。在这种情况下使用tr:

tr '%>' ']' < input.txt

如果您想将序列%>替换为],那么@AvinashRaj所示的sed命令就是解决方法。

我不确定我是否正确回答了这个问题。如果要将%or>替换为],则此处不需要sed。在这种情况下使用tr:

tr '%>' ']' < input.txt
如果要将序列%>替换为],则可以使用@AvinashRaj所示的sed命令。

补充:

由于您使用的是一个不带引号的字符串,既不是单引号,也不是双引号,因此通过对sed命令中的单个字符进行转义,您的做法是正确的

但是,您忽略了\-quote>,这就是导致您出现问题的原因:

>是shell的所谓元字符之一 元字符具有特殊的含义和独立的单词 因此,s/\%>\/\]\/g被>>错误地分成两个参数: s/\%作为s/%传递给sed,因为shell通过一个名为quote removation的过程删除\实例。 正如您所看到的,这不是一个有效的sed命令,但它甚至不起作用-请参见下文。 >\/\]\/g由shell bash解释,因为它以输出重定向操作符>开头;删除引号后,shell会看到>/]/g,尝试打开文件/]/g进行写入,但失败,因为系统的根目录中没有名为]的子目录。 bash尝试在运行命令之前打开重定向指定的输出文件,如果无法打开该文件,则不会运行该命令-这就是此处发生的情况: bash抱怨目标目录不存在,并中止了对命令的处理,甚至从未调用过sed。 结果:

在既不包含在单引号中也不包含在双引号中的字符串中,您必须: 所有元字符:|&;<>空间选项卡 此外,为了防止意外的路径名扩展:?[ 还请注意,如果需要为sed引用转义字符,则需要添加一层额外的引号;例如,指示sed使用文字。在正则表达式中,必须传递\.-两个反斜杠,以便sed看到正确转义的\。。 鉴于上述情况,在sed命令周围习惯性地使用单引号要简单得多,因为它确保字符串按原样传递给sed。 为了简洁起见,让我们将命令的工作版本与省略-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
补充:

由于您使用的是一个不带引号的字符串,既不是单引号,也不是双引号,因此通过对sed命令中的单个字符进行转义,您的做法是正确的

但是,您忽略了\-quote>,这就是导致您出现问题的原因:

>是shell的所谓元字符之一 元字符具有特殊的含义和独立的单词 因此,s/\%>\/\]\/g被>>错误地分成两个参数: s/\%作为s/%传递给sed,因为shell通过一个名为quote removation的过程删除\实例。 正如您所看到的,这不是一个有效的sed命令,但它甚至不起作用-请参见下文。 >\/\]\/g由shell bash解释,因为它以输出重定向操作符>开头;删除引号后,shell会看到>/]/g,尝试打开文件/]/g进行写入,但失败,因为系统的根目录中没有名为]的子目录。 bash尝试在运行命令之前打开重定向指定的输出文件,如果无法打开该文件,则不会运行该命令-这就是此处发生的情况: bash抱怨目标目录不存在,并中止了对命令的处理,甚至从未调用过sed。 结果:

在既不包含在单引号中也不包含在双引号中的字符串中,您必须: 所有元字符:|&;<>空间选项卡 此外,为了防止意外的路径名扩展:?[ 还请注意,如果需要为sed引用转义字符,则需要添加一层额外的引号;例如,指示sed使用文字。在正则表达式中,必须传递\.-两个反斜杠,以便sed看到正确转义的\。。 鉴于上述情况,在sed命令周围习惯性地使用单引号要简单得多,因为它确保字符串按原样传递给sed。 为了简洁起见,让我们将命令的工作版本与省略-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
在逗号周围加引号
nd:sed-r's/\%>\/\]\/g'@mouviciel它将不起作用,因为您逃过了分隔符。@AvinashRaj-您是对的!在命令sed-r的/\%>\/\]\/g'@mouviciel周围加引号它将不起作用,因为您逃过了分隔符。@AvinashRaj-您是对的!问题似乎是针对基于使用s而非t的sed操作或s@NeronLeVelu中的类字符的角色同级。t命令不符合您在sed中的想法。问题似乎是针对基于使用s而非t的sed操作或s中的类字符的角色同级s、 @NeronLeVelu t命令没有做你在SED中可能会想到的事情。谢谢你的解释非常清楚,事实上@Avinash Raj的回答很好,但是如果没有你的解释,我永远不会理解为什么!还有一个问题,如果我想替换2个不同的,我怎么能像那样与commande关联呢characters@iceman225对不起,我不明白。你说的是正则表达式中的字符集,比如[ab]来匹配单个字符,即“a”或“b”?我必须在我的文件中进行替换,所以我想用sed制作一个Syntax来替换这两个字符。@iceman225:最简单的方法是将两个命令串在一起,以;:sed的/%>/]/g;非常感谢您的解释,非常清楚,事实上@Avinash Raj的回答很好,但是如果没有您的解释,我永远都不会理解为什么!还有一个问题,如果我想替换2个不同的,我怎么能像那样与commande关联呢characters@iceman225对不起,我不明白。你说的是正则表达式中的字符集,比如[ab]来匹配单个字符,即“a”或“b”?我必须在我的文件中进行替换,所以我想用sed制作一个Syntax来替换这两个字符。@iceman225:最简单的方法是将两个命令串在一起,以;:sed的/%>/]/g;/