【问题标题】:sed/awk specify ranges in regexsed/awk 在正则表达式中指定范围
【发布时间】:2014-08-01 20:16:36
【问题描述】:

我有一个这样的文件列表输出:

/path/F201405151800
/path/F201405151900
/path/F201405152000
/path/F201405152100

我将此输出通过管道传输到 sed 并使用以下语法:

sed -n '/F.\{8\}'$var1'/,/F.\{8\}'$var2'/p'

$var1 和 $var2 是用户输入,可以看出,它们指的是我的文件列表中一天中的几个小时。如果找到 $var1 和 $var2 值,上述语法就可以完美运行。但是如果 $var1 的值为 16,而 $var2 的值为 19,sed 将不会输出任何内容,因为在上述文件列表范围内找不到 16。

解决方案是:

sed -n '/F.\{8\}1[6-9]/p'

...这可行,但我现在面临的问题是如何指定两位数范围以包含以下内容:16-20。我尝试在单引号之间进行通配符(就像我正在使用变量一样),如下所示:

sed -n '/F.\{8\}'{16..21}'/p'

...但我得到的输出是:

sed: can't read /F.\{8\}16/p: No such file or directory
sed: can't read /F.\{8\}17/p: No such file or directory
sed: can't read /F.\{8\}18/p: No such file or directory
sed: can't read /F.\{8\}19/p: No such file or directory
sed: can't read /F.\{8\}20/p: No such file or directory
sed: can't read /F.\{8\}21/p: No such file or directory

我真的不需要使用 sed,我用 awk 探索了一些选项,但无法获得我想要的,主要问题是我不知道如何指定正则表达式 RS,以便我有时间阻止作为 awk 字段并执行一些条件,例如

'$2 > 16 && $2 < 21 {print}'

【问题讨论】:

    标签: regex bash sed range


    【解决方案1】:

    你可以使用这个 awk:

    awk -F'/' '{h=$3; gsub(/^F[0-9]{6}|[0-9]{4}$/, "", h)} h > 12 && h < 21' file
    /path/F201405151800
    /path/F201405151900
    /path/F201405152000
    /path/F201405152100
    

    【讨论】:

    • 这个语法对我没有任何显示。 GNU awk 3.1.8
    【解决方案2】:

    为了获得两位数的范围,您可以尝试以下方法:

    sed -n '/F.\{8\}(1[6-9]|2[01])/p'
    

    【讨论】:

    • 不打印任何东西。
    【解决方案3】:

    尝试添加-e:

    sed -n -e '/F.\{8\}'"$var1"'/,/F.\{8\}'"$var2"'/p'
    

    并且总是引用变量以防止分词。

    更新:

    awk -v A=17 -v B=21 -F/ '!/\/F[0-9]{12}$/{next} {h = substr($NF, 10, 2)} h >= A && h <= B'
    

    【讨论】:

    • 不起作用。我什至尝试使用特定值而不是变量。如果未找到其中一个值,sed 将不打印任何内容。
    • 当您尝试使用特定值而不是变量时发生了什么,它是否打印了任何内容?
    • 它没有打印任何东西。
    • sed -n -e '/F.\{8\}1800/,/F.\{8\}2100/p' file 为我打印了四行。您确定您对var1var2 的输入正确吗?您可以通过在其上放置 echo 来调试您的命令:echo sed -n -e '/F.\{8\}'"$var1"'/,/F.\{8\}'"$var2"'/p'&lt;new line&gt;&lt;actual command&gt;
    • 请查看我的问题和我的第一条评论。当我指定的值存在时,它已经对我有用。但是当我输入一个小于 18 的值时,sed 不会打印任何东西。
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多