使用 sed 和 grep 命令从文件中提取带有特殊字符的数字



我正在尝试在与数字后面放置的单词匹配后提取用方括号括起来的数字。 例如。

该文件包含

xxxx [098] yyyy zzzz

我需要搜索 yyyy,如果它在行中匹配,我必须提取 098 本身。

我正在尝试

sed 's/.*[([^]]*)].*/1/g' str.txt

用于提取没有模式匹配的数字。

并且正在使用

sed -nr 's/.*( |^)([0-9]+) yyyy.*/2/p' str.txt 

对于模式匹配,并获取在该匹配之前放置的数字。但是我无法合并这两个命令。我对错误感到困惑

sed:-e 表达式 #1,字符 26:未知选项到"s">

我认为这是因为更多地使用/作为分隔符。

对于

您决定在某个条件下进行打印的情况,您始终需要使用条件打印逻辑。使用 -np 谓词,您可以控制命令仅在匹配成功时打印匹配的组。

因此,结合您的尝试,您需要类似的东西

sed -n 's/.*[([^]]*)][[:space:]]yyyy.*/1/p' 

除了[..]字符串之后的yyyy之外,不会打印任何其他情况。

但是,如果您决定使用awk,那么解析空间不受限制的文件非常容易,其中您的结果可以简单地写为

awk '$3 == "yyyy" { gsub(/[][]/,"",$2); print $2 }'
<</div> div class="one_answers">

当你标记了 grep 时,如果你可以使用 gnu grep,另一个选择是使用 -P 选项Perl-compatible regular expression并使用 lookarounds:

grep -Po "(?<=[)d+(?=] yyyy)" str.txt

那会给你098

如果 'd' 中的数据在 GNU sed 上尝试

sed -E 's/.*xxxxs*[(098)]s*yyyy.*/1/' d

最新更新