Shell - 读取时跳过匹配行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell - 读取时跳过匹配行相关的知识,希望对你有一定的参考价值。
我正在寻找有关我的shell的帮助......希望我能在这里找到它......
这是我的代码:
#!/bin/sh
while IFS= read -r line || [ -n "$line" ]
do
[[ "$line" =~ ^[[:space:]]*# ]] && continue # This line must stay
[[ "$line" =~ *read[[:space:]]-r[[:space:]]line* ]] && continue
echo "${line%$NL}"
done < $0
第一次测试将禁止“仅评论行”。第二个测试目的是抑制“while IFS = read ...”行 - 无论如何,它只是一个测试:-)
“完成<$ 0”已在这里写成故意...进行测试!
运行shell输出:
while IFS= read -r line || [ -n "$line" ]
do
[[ "$line" =~ ^[[:space:]]*# ]] && continue # This line must stay
[[ "$line" =~ *read[[:space:]]-r[[:space:]]line* ]] && continue
echo "${line%$NL}"
done < $0
因为我认为第一行将因为匹配然后第二次测试而消失。
我的错是什么?
为了记录,我不想使用额外的sed或awk句子。
实际上,输入数据(这里是$ 0文件)必须是标准输入(例如,从tee命令中提取)。我读了很多关于这个的stackOverflow主题,sed或awk响应与我的目的不符。
答案
正则表达式无效。简短的测试显示:
> [[ 'while IFS= read -r line || [ -n "$line" ]' =~ *read[[:space:]]-r[[:space:]]line* ]]
> echo $?
2
*
不能“独自” - 它不能成为POSIX extended regular expression中的第一个角色。它必须“绑定”某些东西,例如。一个点.
。点代表任何字符。你要:
[[ $line =~ .*read[[:space:]]-r[[:space:]]line.* ]]
另一答案
问题是在第二个*
线的正则表达式中存在起始量词continue
。你可以使用:
[[ "$line" =~ read[[:space:]]+-r[[:space:]]+line ]] && continue
在这个正则表达式中,没有必要在read
之前或在line
之后匹配任何东西。
此外,最好在+
之后使用量词[[:space:]]
使其匹配1个或更多的空格。
您可以执行更多重构,并使用此代码中的替换将两个正则表达式合并为一个:
while IFS= read -r line || [[ -n $line ]]
do
[[ $line =~ ^[[:space:]]*#|read[[:space:]]+-r[[:space:]]+line ]] && continue
echo "${line%$NL}"
done < $0
以上是关于Shell - 读取时跳过匹配行的主要内容,如果未能解决你的问题,请参考以下文章