删除标点符号标准输入。

时间:2014-05-07 05:11:04

标签: bash

我希望程序可以删除从标准输入读取的标点符号 我的代码是:

echo $* | tr -d '[:punct:]'

它可以处理一些简单的情况,但是当我在终端输入输入时(例如:无论广告!:):

当句子内连续几个标点符号时,终端会反映结果:-bash:!“:找不到事件

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:4)

应使用单引号来避免扩展,例如

echo 'whatever ad!' | tr -d '[:punct:]'

在bash shell下打印出来

whatever ad

如果你想使用变量

BUFF='whatever ?_-!!!!ad!'; echo "$BUFF" | tr -d '[:punct:]'

编辑1

根据您的要求,这是一个完整的脚本

#!/bin/sh
functionStripAndPrint()
{
  echo "$@" | tr -d '[:punct:]'
}

functionStripAndPrint "$@"

假设此脚本存储在stripchars.sh文件中,您可以像这样调用它

./stripchars.sh 'das !adsa _sda ssad-'

它会打印

das adsa sda ssad

编辑2

您可以使用set解决某些特殊字符的解释,例如

set +H

停用与!符号关联的the H option,因此现在!只是一个没有特殊含义的感叹号。然后,您可以稍微简化一下调用

./ stripchars.sh sdfsa!fdsaf?\'

正如您所看到的,此时唯一的问题是仍然需要转义的'

如果您想重新启用H,请执行

set -H

set可以很方便地修改你的shell的行为,我不知道你的情况是否值得,shell对于一些基本的东西来说很好用,但是我不喜欢不知道这是否符合您的需求,您知道的更好,请查看set,看看它是否足够。

答案 1 :(得分:1)

您可能知道,bash使用!从命令历史中获取命令。当您键入

echo Whatever ad!":

它尝试使用!":从命令历史记录中检索命令。由于它没有找到任何使用它的命令,它会打印消息

bash: !": event not found

您可以通过(1)使用单引号将这些特殊字符传递给bash,以便将特殊字符视为普通字符,或者(2)转义特殊字符。

echo 'Whatever ad!":'  | tr -d '[:punct:]' 
echo Whatever ad\!\":  | tr -d '[:punct:]'