【问题标题】:Removing punctuation and tabs with sed使用 sed 删除标点符号和制表符
【发布时间】:2017-06-25 18:57:49
【问题描述】:

我正在使用以下内容来删除标点符号、制表符,并将文本文件中的大写文本转换为小写。

sed 's/[[:punct:]]//g' $HOME/file.txt | sed $'s/\t//g' | tr '[:upper:]' '[:lower:]'

我是否需要使用这两个单独的 sed 命令来删除标点符号和制表符,还是可以使用单个 sed 命令来完成?

另外,有人能解释一下$ 在第二个sed 命令中的作用吗?没有它,该命令不会删除选项卡。我查看了手册页,但没有看到任何提到这一点的内容。

输入文件如下所示:

Pochemu oni ne v shkole?
Kto tam?
Otkuda eto moloko?
Chei chai ona p’et?
    Kogda vy chitaete?
    Kogda ty chitaesh’?

【问题讨论】:

    标签: bash macos sed tr


    【解决方案1】:

    单个sed 和多个-e 表达式,可以如下为FreeBSD sed 完成

    sed -e $'s/\t//g' -e "s/[[:punct:]]\+//g" -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file
    

    使用y 限定符,

    [2addr]y/string1/string2/
          Replace all occurrences of characters in string1 in the pattern 
          space with the corresponding characters from string2.
    

    如果在GNU sed 中,用于小写转换的\L 量词应该可以正常工作。

    sed -e $'s/\t//g' -e "s/[[:punct:]]\+//g" -e "s/./\L&/g" 
    

    $'' 是一个bash 引用机制来启用 ANSI C-like escape sequences.

    【讨论】:

    • @I0_ol: 你能输出sed --version吗?它在GNU sed 上运行良好
    • 我使用的是 Mac OS X
    • \L 转义是不可移植的。便携式替代品是y/ABC/abc/,但您无法(便携式)访问范围,因此您必须枚举整个字母表,包括大写和小写。
    • 我从 Homebrew 安装了gsed。现在可以gsed -e "s/[[:punct:]]\+//g" -e "s/./\L&/g" -e $'s/\t//g' ~/file.txt感谢您的帮助。
    • @NeronLeVelu:请参考我在更新中包含的嵌入式链接,这是一种 bash 引用方式来解释转义序列,如 \t
    猜你喜欢
    • 2021-07-02
    • 2016-07-06
    • 2014-06-20
    • 1970-01-01
    • 2015-08-19
    • 2012-06-25
    • 2023-01-03
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多