bash检查一个字符串是否有多个字符

时间:2015-12-13 12:57:23

标签: bash shell unix if-statement

标题实际上几乎解释了一切。我想检查一个字符串是否包含一个字母(不是特定的字母,实际上是任何字母)不止一次。

例如:

用户:

test.sh this list

脚本:

if [ "$1" has some letter more then once ]
then 
do something
fi

3 个答案:

答案 0 :(得分:2)

使用Posix character class

if [[ $1 =~ [[:alpha:]].*[[:alpha:]] ]]; then
  echo "more than one letter"
fi

答案 1 :(得分:0)

这个正则表达式(用bash)会告诉你重复的第一个小写字母 哪个就是这样:

Context

请致电:

#!/bin/bash
regex="([a-z]).*\1"
if [[ $1 =~ $regex ]]; then
    echo "more than one letter ${BASH_REMATCH[1]}"
fi

当然,字母范围可以更改为更低和更高:

$ script.sh "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZz"
more than one letter "z"

但是,只有当LC_COLLATE设置为" C"时,如果设置为UTF-8,那么重音字符也可以包含在a-z范围内。这可能表明:

[a-zA-Z]

这将保留ASCII相信信件的字母:

$ ./sc.sh abcdefghijklémnopéqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZz
more than one letter "é"

字符范围可以是POSIX character ranges中的一些:

$ LC_COLLATE=C ./sc.sh abcdefghijklémnopéqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZz
more than one letter "z"

请注意,这些范围的含义也会因使用的字符集而改变。

答案 2 :(得分:0)

如果您只想使用基本命令,可以使用类似的东西......

String data = (String) displayContents;
    StringBuilder buff = new StringBuilder();
    String delim = "|";

    String[] tokens = data.split(delim);
    File myFile = new File("/sdcard/jsonFormat.txt");
    buff.append(tokens);

    data = data.substring(1, data.length()-1);
    FileOutputStream fOuts = new FileOutputStream(myFile);
    JSONObject jsonObject = new JSONObject();

    for(int index=0;index < tokens.length ;index++){
        String[] sub_tokens = tokens[index].split(":");
        jsonObject.put(sub_tokens[0],sub_tokens[1]);
    }

    OutputStreamWriter myOutWriter = new OutputStreamWriter(fOuts);
    myOutWriter.append(jsonObject.toString());
    myOutWriter.close();

如果不清楚,可以很容易地在命令行上的每个步骤中尝试这样... #!/bin/bash PATH=/bin/:/usr/bin/:$PATH if [ `echo $* | tr -d ' ' | sed 's/\(.\)/\1\n/g' | sort | uniq -c | tr -s ' ' | sort -n | grep -v '^ 1 ' | wc -l` -ge 1 ] then echo "Input contains duplicate characters" fi 查看输出,然后将echo test input | tr -d ' '部分添加到其中,等等等等。

第一个sed将确保输入中的空格不会被视为重复。例如,如果输入是“abcd efgh ijkl”,则唯一重复的字符是空格。如果你将tr -d ' '保留在那里,脚本将不会将输入计为具有重复字符,如果删除它,脚本会将输入计为重复字符。

干杯。

- Parag