Linux 在sed中替换控制字符

Linux 在sed中替换控制字符,linux,bash,shell,sed,Linux,Bash,Shell,Sed,我需要在linux中替换文本文件中出现的所有控制字符CTRL+A(SOH/ascii 1),如何在SED中实现这一点?使用“替换”,我假设您希望“就地”更改文件 使用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/

我需要在linux中替换文本文件中出现的所有控制字符CTRL+A(SOH/ascii 1),如何在SED中实现这一点?

使用“替换”,我假设您希望“就地”更改文件

使用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 's/^A/foo/g' file

使用Ctrl+V+A在上述命令中创建
^A
序列。

要用什么替换它们?如果替换为单个字符,
tr
是比
sed
更好的选择。替换为字母“a”:

tr '\1' a < input-file > tmp && mv tmp input-file
tr'\1'atmp&mv tmp输入文件

这可以通过
cat
-v
(相当于
——显示非打印
选项并将其输送到
sed
)来完成

如果控制字符是标题的开头(SOH)字符(CTRL+A/ASCII 1),并且我们希望用制表符替换它,我们将执行以下操作:

cat -v file | sed 's/\^A/\t/g' > out
cat-v
将用^A替换SOH字符,然后在
sed
中匹配并替换该字符。您可以使用tr命令

tr-s'\001''|'新文件


tr-s“word或delimiter”要替换为“word或delimiter”新文件

在“Ctrl-V A”快捷方式上的正确点。我正要把它作为对我答案的评论。我最初建议使用\x01语法,因为它更容易复制和粘贴到脚本中,并且可以直观地检查字符是否正确(在某些编辑器中)。我喜欢CTRL+V。当我按CTRL+V+ESC键时,它被插入^[那太好了!@dogbane知道
^A
是什么意思吗?实际上OSX
sed
也有
-i
,尽管它需要一个参数。如果你不需要备份,试试
sed-i'
。很有趣,谢谢。我不知道它是否在我检查的版本中,或者我是否只是错过了它。我使用的sed在一个ve中旧机器(SunOS 5.10)此解决方案是列表中唯一有效的解决方案。感谢如果您的文件恰好包含两个字符^A,则此解决方案不起作用。直接对控制字符值进行操作而不是对其打印形式进行操作会更好。
tr
是一种方法。但除非您真正测试结果。无论是单引号
'\1'
还是使用
\1
都会得到不同的结果。这不是OP想要的结果。
-s
意味着删除重复字符,而不是用另一个字符替换一个字符。