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 - 读取时跳过匹配行的主要内容,如果未能解决你的问题,请参考以下文章

push_back 时跳过向量位置

使用正则表达式和 sed 时跳过前 n 行?

导入 CSV 时跳过标题或第一行

如何在使用 scandir() 时跳过我无权读取/访问的文件,以避免所有记录的错误?

在 CSS 中突出显示悬停时跳过所有其他单元格

c ++程序在输入时跳过行[控制台应用程序]