【问题标题】:Replace dot, exclamation and ask sign with sed in Linux在 Linux 中用 sed 替换点、感叹号和问号
【发布时间】:2015-04-09 16:46:48
【问题描述】:

我正在尝试使用此代码

sed "s/\!{2,}/\!/g" "s/\?{2,}/\?/g" "s/\.{2,}/\./g" file.txt

它几乎可以工作,但它不能代替点

-输入会是这样的

你好!!!你好吗?? .....

-输出应该是

你好!你好吗?

【问题讨论】:

  • 请显示示例输入和期望与实际输出。
  • 还有你希望从样本数据中得到什么输出。
  • hmm... sed -e 's/\.{2,}/\./g' 不起作用,但 sed -e 's/\.\.*/\./g' 起作用。 sed 是否支持{a,b} 样式匹配计数?
  • 我要改!!或更多到一个!;并用'!','?和 '。'但它只是替换感叹号和询问符号,不适用于点

标签: linux unix replace sed terminal


【解决方案1】:
# posix
sed 's/\([.?!]\)\1\{1,\}/\1/g' file.txt
# GNU
sed 's/\([.?!]\)\1+/\1/g' file.txt

一次将类用于 1 个操作

【讨论】:

    【解决方案2】:

    我的回答可能有点“离题”,使用 tr 似乎是这里最短的路线

    tr -s '?.!'
    

    对文件使用 tr

     tr -s '?.!' < '/root/Desktop/test'
    

    回声示例

    echo 'hello!!! my name is John...how are you??'| tr -s '?.!'
    

    输出

    hello! my name is John.how are you?
    

    【讨论】:

      【解决方案3】:
      $ echo "Hello!!! How are you?? ....." | sed -r 's/\.+/./g; s/\?+/?/g; s/!+/!/g'
      Hello! How are you? .
      

      【讨论】:

        【解决方案4】:

        在花括号 { 和 } 前添加反斜杠

        sed 使用 posix 基本正则表达式,其语法需要大括号(和分组括号)前的反斜杠以赋予它们特殊的含义。 否则它匹配文字字符 { 和 }

        echo -n foo | sed -e 's/o\{2,\}/o/g'
        

        【讨论】:

          猜你喜欢
          • 2017-01-15
          • 2012-11-01
          • 2013-07-12
          • 2022-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          相关资源
          最近更新 更多