标题实际上几乎解释了一切。我想检查一个字符串是否包含一个字母(不是特定的字母,实际上是任何字母)不止一次。
例如:
用户:
test.sh this list
脚本:
if [ "$1" has some letter more then once ]
then
do something
fi
答案 0 :(得分:2)
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