【问题标题】:Replacing Control Character in sed替换 sed 中的控制字符
【发布时间】:2012-10-22 05:11:39
【问题描述】:

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

【问题讨论】:

    标签: linux bash shell sed


    【解决方案1】:

    试试:

    sed 's/^A/foo/g' file
    

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

    【讨论】:

    • “Ctrl-V A”快捷方式的要点。我正准备将它作为评论添加到我的答案中。我最初建议使用 \x01 语法,因为它更容易复制并粘贴到脚本中,并且可以直观地检查它是否是正确的字符(在某些编辑器中)。
    • 喜欢那个 CTRL+V 的东西。当我执行 CTRL+V+ ESC 键时,它插入了 ^[ 太好了!
    • @dogbane 知道^A 是什么意思吗?
    【解决方案2】:

    通过“替换”,我假设您想“就地”更改文件。

    使用 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 管道传输到临时文件来解决此问题。

    【讨论】:

    • 实际上 OSX sed 也有 -i,尽管它需要一个参数。如果您不需要备份,请尝试 sed -i ''。
    • 很有趣,谢谢。我不知道我检查的版本中是否没有它,或者我只是错过了它。
    【解决方案3】:

    这可以通过cat 和-v 来完成(等效于--show-nonprinting 选项并将其传递到sed)。

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

    cat -v file | sed 's/\^A/\t/g' > out
    

    cat -v 会将 SOH 字符替换为 ^A,然后在 sed 中匹配和替换。

    【讨论】:

    • 我使用的 sed 在一台非常旧的机器上(SunOS 5.10),这个解决方案是列出的唯一一个有效的解决方案。谢谢
    • 如果您的文件恰好包含两个字符 ^A,这将不起作用。直接对控制字符值而不是其打印表示进行操作会更好。
    【解决方案4】:

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

    tr '\1' a < input-file > tmp && mv tmp input-file
    

    【讨论】:

    • tr 是要走的路。但除非你真的测试结果,否则我不会推荐单线。无论是单引号 '\1' 还是使用 \1,都会得到不同的结果。
    【解决方案5】:

    你可以使用 tr 命令

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

    tr -s "word or delimiter" 想替换成"word or delimiter" newfile

    【讨论】:

    • 这不是 OP 想要的。 -s 表示删除重复的字符,而不是将一个字符替换为另一个字符。
    猜你喜欢
    • 2012-10-09
    • 2021-10-25
    • 2020-03-13
    • 2011-10-04
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多