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文档或任何其他地方的字符串中,并确保它将以与最初相同的方式进行解析,而不会在取消跳转阶段使用反斜杠。