检查子字符串是否包含在字符串中并且至少具有前 4 个字符

Mar*_*mbo 8 bash awk

示例字符串是:

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)

anu*_*ava 8

你可以这样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)


Dad*_*ada 5

indexPerl的功能似乎经过调整:给定两个字符串,它返回第二个字符串在第一个字符串中出现的索引,如果没有出现,则返回 -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)。