示例字符串是:
abcdefghijklmno
Run Code Online (Sandbox Code Playgroud)
如果我输入:
abc FALSE #at least 4 characters.
abcd TRUE
cdefg FALSE #because the match must start from the first character.
abcde TRUE
abcdeghi FALSE #because the characters must be contained consecutively.
abcdefgh TRUE
abcdefghi TRUE
abcdefghijklmno TRUE
abcdefghijklmnop FALSE #because it exceeds the example string.
Run Code Online (Sandbox Code Playgroud)
我试过了:
set -- abc
i=1
[[ abcdefghijklmno == ${!i}* ]]
echo $?
Run Code Online (Sandbox Code Playgroud)
但也会echo "$?"
返回 3、2、10
或 0 个字符。
其他代码显然是错误的,但它是为了传达我想做的事情:
set -- abc
i=1
[[ abcdefghijklmno == ${!i}{4}* ]]
echo $?
Run Code Online (Sandbox Code Playgroud)
编辑:
适合我的解决方案如下:
set -- abc
i=1
[[ abcdefghijklmno == ${!i}* && $(expr length "${!i}") -ge 4 ]]
echo $?
Run Code Online (Sandbox Code Playgroud)
你可以这样awk
:
awk -v s='abcdefghijklmno' '{
print $0, (length($1) > 3 && index(s, $1) == 1 ? "TRUE" : "FALSE")}' file | column -t
abc FALSE
abcd TRUE
cdefg FALSE
abcde TRUE
abcdeghi FALSE
abcdefgh TRUE
abcdefghi TRUE
abcdefghijklmno TRUE
abcdefghijklmnop FALSE
Run Code Online (Sandbox Code Playgroud)
解释:
column
命令仅用于表格输出。length($1) > 3 && index(s, $1) == 1
: 检查第一个字段的长度大于3
并$1
从给定字符串中的第一个位置找到的条件s
。或者,我们也可以使用正则表达式$1
从一开始就检查是否存在:
awk -v s='abcdefghijklmno' '{
print $0, (length($1) > 3 && s ~ "^" $1 ? "TRUE" : "FALSE")
}' file
Run Code Online (Sandbox Code Playgroud)
index
Perl的功能似乎经过调整:给定两个字符串,它返回第二个字符串在第一个字符串中出现的索引,如果没有出现,则返回 -1。因此,您要做的是检查第二个字符串是否出现在第一个字符串中,索引为 0。然后,您可以使用该length
函数来确保第二个字符串的长度超过 4 个字符
例如,
length("abc") >= 4 && index("abcdefghijklmno", "abc") == 0 # true
length("cdefg") >= 4 && index("abcdefghijklmno", "cdefg") == 0 # false
length("abcdefghijklmno") >= 4 && index("abcdefghijklmno", "abcdefghijklmno") == 0 # true
Run Code Online (Sandbox Code Playgroud)
要在单行中使用它,一种方法是在命令行上提供两个字符串。例如:
perl -e 'print length($ARGV[1]) >= 4 && index($ARGV[0], $ARGV[1]) == 0 ? "TRUE" : "FALSE"' abcdefghijklmno abc
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过使用正则表达式来牺牲可读性以求简洁:
perl -e 'print $ARGV[0] =~ /^\Q$ARGV[1]\E(?<=.{4})/ ? "TRUE" : "FALSE"' abcdefghijklmno abcde
Run Code Online (Sandbox Code Playgroud)
正则表达式检查第一个字符串是否以第二个 ( /^\Q$ARGV[1]\E
)开头,以及第二个字符串的长度是否为 4 个字符或更多 ( (?<=.{4})
; 请参阅perlre#lookaround-assertions
)。
归档时间: |
|
查看次数: |
107 次 |
最近记录: |