用 sed 替换特殊字符
Replace specials characters with sed
我正在尝试使用 sed 命令替换文件中的特殊字符。
字符 %>
替换为 ]
。
我正在使用 sed -r s/\%>\/\]\/g
但出现此错误 bash: /]/g: No such file or directory
,看起来 sed 不喜欢它。
将您的 sed 代码放在引号内,并添加您要使用的文件路径,最后不要转义 sed 定界符。
$ echo '%>' | sed 's/%>/]/g'
]
即
sed 's/%>/]/g' file
我不确定我是否答对了问题。如果您想将 %
或 >
替换为 ]
,则此处不需要 sed
。在这种情况下使用 tr
:
tr '%>' ']' < input.txt
如果您想用 ]
替换序列 %>
,那么 @AvinashRaj 显示的 sed
命令是可行的方法。
补充:
由于您使用的是整个未加引号的字符串(既不是单引号也不是双引号),您通过 \
-转义 个别 个字符走在了正确的轨道上你的 sed
命令。
然而,您忽略了 \
-quote >
,这就是导致您出现问题的原因:
>
是 shell 的所谓 元字符之一
- 元字符有特殊含义和单独的词
- 因此,
s/\%>\/\]\/g
被>
错误地分成了2个参数:
s/\%
传递给 sed
- 作为 s/%
,因为 shell 删除了 \
个实例(一个名为 的进程引用删除)。
- 如您所见,这不是一个有效的
sed
命令,但它甚至没有发挥作用 - 见下文。
>\/\]\/g
由 shell (bash
) 解释,因为它以输出重定向运算符 >
开头;删除引号后,shell 看到 >/]/g
,尝试打开 file /]/g
进行写入,但失败了,因为您的系统没有在其根目录中名为 ]
的子目录。
bash
尝试在 运行 命令之前打开由重定向指定的输出文件 ,如果打开文件失败, 不 运行 命令 - 这就是这里发生的事情:
bash
抱怨目标目录不存在并中止了命令的处理 - sed
甚至从未被调用过 .
结果:
- 在既没有用单引号也没有用双引号括起来的字符串中,您必须
\
-引号:
- 所有元字符:
| & ; ( ) < > space tab
- 此外,为了防止意外的路径名扩展(通配):
* ? [
- 另请注意,如果您需要为
sed
引用(转义)字符 ,则需要添加一个 额外的引用层 ;例如,要指示 sed
在正则表达式中使用 literal .
,您必须传递 \.
- two 反斜杠 - 以便 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 命令替换文件中的特殊字符。
字符 %>
替换为 ]
。
我正在使用 sed -r s/\%>\/\]\/g
但出现此错误 bash: /]/g: No such file or directory
,看起来 sed 不喜欢它。
将您的 sed 代码放在引号内,并添加您要使用的文件路径,最后不要转义 sed 定界符。
$ echo '%>' | sed 's/%>/]/g'
]
即
sed 's/%>/]/g' file
我不确定我是否答对了问题。如果您想将 %
或 >
替换为 ]
,则此处不需要 sed
。在这种情况下使用 tr
:
tr '%>' ']' < input.txt
如果您想用 ]
替换序列 %>
,那么 @AvinashRaj 显示的 sed
命令是可行的方法。
补充
由于您使用的是整个未加引号的字符串(既不是单引号也不是双引号),您通过 \
-转义 个别 个字符走在了正确的轨道上你的 sed
命令。
然而,您忽略了 \
-quote >
,这就是导致您出现问题的原因:
>
是 shell 的所谓 元字符之一- 元字符有特殊含义和单独的词
- 因此,
s/\%>\/\]\/g
被>
错误地分成了2个参数:s/\%
传递给sed
- 作为s/%
,因为 shell 删除了\
个实例(一个名为 的进程引用删除)。- 如您所见,这不是一个有效的
sed
命令,但它甚至没有发挥作用 - 见下文。
- 如您所见,这不是一个有效的
>\/\]\/g
由 shell (bash
) 解释,因为它以输出重定向运算符>
开头;删除引号后,shell 看到>/]/g
,尝试打开 file/]/g
进行写入,但失败了,因为您的系统没有在其根目录中名为]
的子目录。
bash
尝试在 运行 命令之前打开由重定向指定的输出文件 ,如果打开文件失败, 不 运行 命令 - 这就是这里发生的事情:bash
抱怨目标目录不存在并中止了命令的处理 -sed
甚至从未被调用过 .
结果:
- 在既没有用单引号也没有用双引号括起来的字符串中,您必须
\
-引号:- 所有元字符:
| & ; ( ) < > space tab
- 此外,为了防止意外的路径名扩展(通配):
* ? [
- 另请注意,如果您需要为
sed
引用(转义)字符 ,则需要添加一个 额外的引用层 ;例如,要指示sed
在正则表达式中使用 literal.
,您必须传递\.
- two 反斜杠 - 以便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