【发布时间】:2012-10-22 05:11:39
【问题描述】:
我需要在 linux 的文本文件中替换所有出现的控制字符 CTRL+A (SOH/ascii 1),这在 SED 中如何实现?
【问题讨论】:
我需要在 linux 的文本文件中替换所有出现的控制字符 CTRL+A (SOH/ascii 1),这在 SED 中如何实现?
【问题讨论】:
试试:
sed 's/^A/foo/g' file
在上述命令中使用Ctrl+V+A创建^A序列。
【讨论】:
^A 是什么意思吗?
通过“替换”,我假设您想“就地”更改文件。
使用 GNU sed:
# Create a file with a single control character (SOH)
echo -e "\x01" > file
# Change SOH control characters to the literal string "SOH"
sed -i 's/\x01/SOH/g' file
# Check result
cat file
给...
SOH
-i 选项在 OS X sed 上不起作用,因此您需要通过将 sed 管道传输到临时文件来解决此问题。
【讨论】:
sed 也有 -i,尽管它需要一个参数。如果您不需要备份,请尝试 sed -i ''。
这可以通过cat 和-v 来完成(等效于--show-nonprinting 选项并将其传递到sed)。
如果控制字符是标题开始 (SOH) 字符 (CTRL+A / ASCII 1),并且我们想用制表符替换它,我们将执行以下操作:
cat -v file | sed 's/\^A/\t/g' > out
cat -v 会将 SOH 字符替换为 ^A,然后在 sed 中匹配和替换。
【讨论】:
你想用什么替换它们?如果替换是单个字符,tr 是比sed 更好的选择。替换为字母“a”:
tr '\1' a < input-file > tmp && mv tmp input-file
【讨论】:
tr 是要走的路。但除非你真的测试结果,否则我不会推荐单线。无论是单引号 '\1' 还是使用 \1,都会得到不同的结果。
你可以使用 tr 命令
tr -s '\001' '|'新文件
tr -s "word or delimiter" 想替换成"word or delimiter" newfile
【讨论】:
-s 表示删除重复的字符,而不是将一个字符替换为另一个字符。