String 如何确定特殊字符是否出现在bash中的另一个第一个特殊字符之前

String 如何确定特殊字符是否出现在bash中的另一个第一个特殊字符之前,string,bash,shell,unix,String,Bash,Shell,Unix,假设我的文件中有这些行 file.txt 8_64056_14^8008286229^hgdggdj^33gg.gggF-gghggt.file.gz 8_64056_414^80082ww8^ghdg^hhjj.gg-ghhthh.file.gz 8_64058-4^80082862dddd9^gggj^34433-gg.file.gz 我需要找到在第一个^之前有-的行。基于此条件,我应该匹配第三行8_64058-4^80082862dddd9^gggj^34433 gg.file.gz。

假设我的文件中有这些行

file.txt

8_64056_14^8008286229^hgdggdj^33gg.gggF-gghggt.file.gz
8_64056_414^80082ww8^ghdg^hhjj.gg-ghhthh.file.gz
8_64058-4^80082862dddd9^gggj^34433-gg.file.gz

我需要找到在第一个
^
之前有
-
的行。基于此条件,我应该匹配第三行
8_64058-4^80082862dddd9^gggj^34433 gg.file.gz
。如何在unix中找到它?

正则表达式可能是最好的选择<代码>*-.\^将查找任何内容,一个破折号或更多内容,然后是一个^


如果您在中阅读了这些行,那么您可以做一个简单的检查,看看字符串是否与regex匹配
[[line=~.*-.*\^]]&&echo“yes”
regex可能是最好的选择<代码>*-.\^将查找任何内容,一个破折号或更多内容,然后是一个^


如果在中读取这些行,则可以进行简单检查,以查看字符串是否与正则表达式匹配
[[line=~.*-.*\^]]&&echo“yes”

目标是选择在第一个
^
之前带有“
-
的行

使用awk 尝试:

awk
一次读取一行输入,并将每行划分为字段
-F^
告诉awk使用
^
作为字段分隔符。因此,如果
-
出现在第一个字段中,
$1
,则
-
出现在第一个
^
之前

以上将返回包含
-
的行,即使它们不包含
^
。如果要排除该情况,请使用:

awk -F^ 'NF >= 2 && $1 ~ /-/' file
NF
是字段数
NF>=2
表示行上至少出现一个
^

使用grep 要选择所有包含前面没有
^
-
行,请尝试:

$ grep '^[^^]*-' file
8_64058-4^80082862dddd9^gggj^34433-gg.file.gz
如果要要求
^
跟随
-
,则:

grep '^[^^]*-.*^' file
sed -n '/^[^^]*-.*^/p' file
^[^^]
看起来可能有点复杂。事实并非如此。第一个
^
要求匹配从行首开始。方括号内的第一个
^
否定匹配。因此,
[^a]
匹配除
a
之外的任何东西,在我们的例子中,
[^^]
匹配除
^
之外的任何东西

使用sed 使用与grep相同的逻辑,尝试:

$ sed -n '/^[^^]*-/p' file
8_64058-4^80082862dddd9^gggj^34433-gg.file.gz
同样,如果您想要求
^
跟在
-
后面,那么:

grep '^[^^]*-.*^' file
sed -n '/^[^^]*-.*^/p' file

这里,
-n
告诉sed不要打印一行,除非我们明确要求它
/^[^^]*-.^/p
告诉它打印与正则表达式匹配的行
^[^^]*-.^

目标是选择在第一次
^
之前带有“
-
的行”

使用awk 尝试:

awk
一次读取一行输入,并将每行划分为字段
-F^
告诉awk使用
^
作为字段分隔符。因此,如果
-
出现在第一个字段中,
$1
,则
-
出现在第一个
^
之前

以上将返回包含
-
的行,即使它们不包含
^
。如果要排除该情况,请使用:

awk -F^ 'NF >= 2 && $1 ~ /-/' file
NF
是字段数
NF>=2
表示行上至少出现一个
^

使用grep 要选择所有包含前面没有
^
-
行,请尝试:

$ grep '^[^^]*-' file
8_64058-4^80082862dddd9^gggj^34433-gg.file.gz
如果要要求
^
跟随
-
,则:

grep '^[^^]*-.*^' file
sed -n '/^[^^]*-.*^/p' file
^[^^]
看起来可能有点复杂。事实并非如此。第一个
^
要求匹配从行首开始。方括号内的第一个
^
否定匹配。因此,
[^a]
匹配除
a
之外的任何东西,在我们的例子中,
[^^]
匹配除
^
之外的任何东西

使用sed 使用与grep相同的逻辑,尝试:

$ sed -n '/^[^^]*-/p' file
8_64058-4^80082862dddd9^gggj^34433-gg.file.gz
同样,如果您想要求
^
跟在
-
后面,那么:

grep '^[^^]*-.*^' file
sed -n '/^[^^]*-.*^/p' file
这里,
-n
告诉sed不要打印一行,除非我们明确要求它
/^[^^]*-.^/p
告诉它只需使用bash就可以打印与正则表达式匹配的行

cat file | while read -r line; do 
    if [[ "${line%%^*}" = *-* ]]; then
        echo "$line";
    fi
done
${line%%^*}
获取第一个
^

对于3个示例字符串,我们得到:

  • 8\u 64056\u 14
  • 8\u 64056\u 414
  • 8_64058-4
那我们就去找
-

[[ "${line%%^*}" = *-* ]]
只是使用bash

cat file | while read -r line; do 
    if [[ "${line%%^*}" = *-* ]]; then
        echo "$line";
    fi
done
${line%%^*}
获取第一个
^

对于3个示例字符串,我们得到:

  • 8\u 64056\u 14
  • 8\u 64056\u 414
  • 8_64058-4
那我们就去找
-

[[ "${line%%^*}" = *-* ]]

我建议使用
[^]
而不是
\^
,因为它在引用上下文中更为一致。您可以将
*-.*[^]
复制并粘贴到JSON文档或其他任何地方的字符串中,并确保它将以与最初相同的方式进行解析,而不会在不可回避的阶段使用反斜杠。我建议使用
[^]
而不是
\^
,因为它在引用上下文中更为一致。您可以将
*-.*[^]
复制并粘贴到JSON文档或任何其他地方的字符串中,并确保它将以与最初相同的方式进行解析,而不会在取消跳转阶段使用反斜杠。