我希望程序可以删除从标准输入读取的标点符号 我的代码是:
echo $* | tr -d '[:punct:]'
它可以处理一些简单的情况,但是当我在终端输入输入时(例如:无论广告!:):
当句子内连续几个标点符号时,终端会反映结果:-bash:!“:找不到事件
任何人都可以提供帮助吗?
答案 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:]'