检查字符串以确定它是否包含在UNIX中的数字字符

我是新来的UNIX,只有有开始了它在今天的工作,但经验丰富的与Java,并有下面的代码:

#/bin/bash echo "Please enter a word:" read word grep -i $word $1 | cut -d',' -f1,2 | tr "," "-"> output

这工作得很好,但我现在需要做的是检查,当字被读取,它包含什么,但信件,如果它在打印数字字符“无效的输入!” 消息,并要求他们再次输入。 我以为用正则表达式if语句是最简单的方式做到这一点,但我不能让我的头围绕如何,因为我用他们的Java应用程序中使用他们在UNIX。 任何帮助,这将不胜感激,因为我无法找到帮助,因为在Linux中的正则表达式我发现只有处理了,如果这是不是所有的数字或不是所有的解决方案在搜索时。

--------------解决方案-------------

另一种方法。 grep的退出与0如果找到匹配,因此您可以测试退出代码:

echo "${word}" | grep -q '[0-9]'
if [ $? = 0 ]; then
echo 'Invalid input'
fi

这是/bin/sh兼容。


结合Daenyth和约翰的建议,这将成为

if echo "${word}" | grep '[0-9]' >/dev/null; then
echo 'Invalid input'
fi

双括号运算符是一个扩展版本test ,它支持通过正则表达式命令=~运算符:

#!/bin/bash

while true; do
read -p "Please enter a word: " word
if [[ $word =~ [0-9] ]]; then
echo 'Invalid input!' >&2
else
break
fi
done

这是一个bash特有的功能。 bash是一个较新的外壳,不适用于所有风格的UNIX - 尽管通过“新的”我的意思是和“UNIX并不是所有的味道:”我的意思是像旧版本文物“只是最近才在后真空管时代的发展” Solaris和HP-UX的。

在我看来,这是最简单的选择和bash是很多便携这些天,但如果被移植到老的UNIX系统其实很重要,那么你就需要使用其他海报“sh兼容的答案。 SH是最常见和最 ​​广泛支持的外壳,但一分钱一分货的便携性,价格正在失去的东西像=~

如果你想编写可移植的shell代码,你的选项字符串操作是有限的。 您可以使用shell匹配模式(这是很多比正则表达式少表现)的case结构:

export LC_COLLATE=C
read word
while
case "$word" in
*[!A-Za-z]*) echo >&2 "Invalid input, please enter letters only"; true;;
*) false;;
esac
do
read word
done

编辑:设置LC_COLLATE因为在大多数非必要C区域设置,字符范围像AZ不具有“显而易见”的意思。 我假设你想要的只是ASCII字母; 如果你也想用变音符号的字母,不改变LC_COLLATE并取代A-Za-z[:alpha:]使整个图案变成*[![:alpha:]]*

有关完整的正则表达式,见expr命令编辑:需要注意的是expr像其他一些基本的shell工具,有缺陷有一些特殊的字符串; 在z以下字符防止$word被解释为保留字expr

export LC_COLLATE=C
read word
while expr "z$word" : 'z[A-Za-z]*$' >/dev/null; then
echo >&2 "Invalid input, please enter letters only"
read word
fi

如果只针对近期够版本的bash的,还有其他选项,如=~运营商[[ ... ]]条件命令。

请注意,您的最后一行有一个bug,第一个命令应该是

grep -i "$word" "$1"

引号是因为有些与直觉相反"$foo"意思是“变量调用的价值foo ,而普通的$foo意思是“取的价值foo ,将其分割成单独的词它包含空格,并把每个单词一个通配图案,并试图展开“。 (事实上,如果你已经检查了$word只包含字母,让引号不会做任何伤害,但它需要更多的时间去思考这些特殊情况,而不是仅仅把报价每一个时代。)

然而,另一个(完全)可移植的方式来做到这一点?

if test "$word" != "`printf "%s" "$word" | tr -dc '[[:alpha:]]'`"; then
echo invalid
fi

一个便携式(假设庆典> = 3)的方式来做到这一点是删除所有的数字和测试长度:

#!/bin/bash
read -p "Enter a number" var
if [[ -n ${var//[0-9]} ]]; then
echo "Contains non-numbers!"
else
echo "ok!"
fi

即将从Java,重要的是要注意的是bash有对象或数据类型没有真正的概念。 一切是一个字符串,而复杂的数据结构是痛苦的最好的。

关于我所做的更多信息,以及其他相关的功能,谷歌的bash的字符串操作。

玩弄猛砸参数扩展和字符类:

# cf. http://wiki.bash-hackers.org/syntax/pe

word="abc1def"
word="abc,def"
word=$'abc\177def'
# cf. http://mywiki.wooledge.org/BashFAQ/058 (no NUL byte in Bash variable)
word=$'abc00def'
word="abcdef"

(
set -xv
[[ "${word}" != "${word/[[:digit:]]/}" ]] && echo invalid || echo valid
[[ -n "${word//[[:alpha:]]/}" ]] && echo invalid || echo valid
)

每个人的答案似乎是基于这样的事实,唯一的无效字符是数字。 最初的问题指出,他们需要检查字符串包含“不过是字母”。

我想做到这一点的最好办法是

nonalpha=$(echo "$word" | sed 's/[[:alpha:]]//g')
if [[ ${#nonalpha} -gt 0 ]]; then
echo "Invalid character(s): $nonalpha"
fi

与如果你找到了这个网页寻找一种方式来检测非数字字符在您的字符串(!像我一样)替换[] [:阿尔法] [[:数字:]。

分类:正则表达式 时间:2012-01-01 人气:1
分享到:

相关文章

  • 可以使用正则表达式的SQL语句从字符串过滤号码? 2012-06-15

    考虑下面的"鸣叫"(左)和"转推"(右)表: +----------+-----------------+ +----------+----+ | tweet_id | text | | tweet_id | rt | +----------+-----------------+ +----------+----+ | 1 | foo {RT|123} bar| | 1 | 123| | 2 | foobar | | 3 | 456| | 3 | {RT|456}

  • 正则表达式去除SQL语句的意见 2013-10-10

    我试图想出一个正则表达式从SQL语句删除注释. 这几乎正​​则表达式的工作原理: (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|'(?:[^']|'')*'|(--.*) Excepth半句不处理" - "意见非常好. 问题是处理SQL字符串,以''分隔. 举例来说,如果我有 SELECT ' -- Hello -- ' FROM DUAL 它不应该匹配,但它匹配. 这是ASP / VBScript中. 我想过匹配的右到左,但我不认为VBScr

  • 正则表达式的表达式语句模​​式 2012-11-23

    我试图使用正则表达式下面的语句提取值,该声明是这样的: from JFK to IND所以,我需要能够提取JFK和IND 你能提供正确的正则表达式帮助? --------------解决方案------------- from\s+(?<origin>[AZ]{3})\s+to\s+(?<destination>[AZ]{3}) 从^([AZ] {3})至([AZ] {3})$ 你想要的值将在两个捕获组. 我就不细说了更多的,除非你指定什么语言要使用的正则表达式的吗?

  • 我要如何插入一个脚本变量转换成一个正则表达式字符串? 2013-01-06

    我正在写试图插入一个目录名到pax命令的脚本,我不知道怎么去正确的语法. 这就是我想要的,但它似乎是治疗$ DIRNAME的正则表达式字符串的一部分. DIRNAME=$(tar -tvf $1 | head -1 | sed -e 's:^.* \([^/]*\)/.*$:\1:') pax -r -f $1 -s'/$DIRNAME\/upload\///' 谢谢! --------------解决方案------------- 尝试使用双引号而不是调用PAX时,单引号: DIRNAME=$

  • 匹配在Javascript中的正则表达式字符串 2014-01-01

    有谁知道如何找到从JavaScript代码的正则表达式字符串? 如VAR模式= /一些正则表达式/; 是否有可能用正则表达式:)? --------------解决方案------------- 如果我收到了你的问题的权利,你需要一个正则表达式,会发现在一个JavaScript程序中的所有正则表达式的话,我不认为这是可能的. 在JavaScript中的正则表达式不必使用//语法,它可以被定义为一个字符串. 即使是一个完全成熟的JavaScript解析器不会聪明到这里检测的正则表达式,比如: va

  • 如何测试一个正则表达式的条件语句 2014-07-19

    我试图一个想出一个办法,以找出是否在正则表达式的条件语句评估为真或假. 我很新的正则表达式很抱歉,如果这是一个明显的问题. 边注:有多个regexs,他们都在不断changing.I我也用java做这个程序. 任何指导,将是非常赞赏. --------------解决方案------------- 你应该写单元测试,声称你想匹配的常见情况. Java的规范测试库的JUnit

  • 正则表达式字符串三个字母和两个数字与前,后的空间 2014-11-11

    两个简单的问题: 什么是正则表达式字符串三个字母和两个数字与之前和之后他们空间(即"LET 12")? 请问您知道任何好的正则表达式的资源/工具? --------------解决方案------------- 对于一个很好的资源,尝试这个网站和程序使用RegexBuddy. 你甚至可以找出使用这些网站的答案,你自己你的问题. 你想要这样的事情您起步: /^[a-zA-Z]{3}\s+[0-9]{2}$/ 但具体细节取决于您的要求. 这可能是一个更好的主意,你学会如何使用自己的正则表达

  • 我如何才能找到该指数相匹配升压正则表达式字符串? 2015-03-09

    我如何才能找到该指数相匹配升压正则表达式字符串? --------------解决方案------------- 如果你使用boost :: regex_match它是整个字符串匹配真实. 也许你的意思是使用regex_search: void index(boost::regex& re,const std::string& input){ boost::match_results<std::string::const_iterator> what; boost::match

  • UNIX正则表达式从字符串基于指数位置提取领域 2013-01-06

    可能重复: 需要一个正则表达式来提取5日至8日在charactors一个字符串. 我与如数字值的字符串:14150712.M; 我需要从索引位置提取numers 5至8答例如:0712我怎样才能从文件名中删除IST四个数字和削减下一个四个数字? --------------解决方案------------- 试试这个正则表达式: /\d{4}(\d{4})/ 所需的数据将在括号内匹配 echo "14150712.M" | cut -c5-8 如果位置是固定的,你可以使用的Bash的字

  • 如何在正则表达式字符串的结尾删除重复的字符 2013-06-25

    谁能帮我用下面的正则表达式 <script type="text/javascript"> function quoteWords() { var search = document.getElementById("search_box"); search.value = search.value.replace(/^\s*|\s*$/g, ""); //trim string of ending and beginning whit

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.542 (s). 10 q(s)