gpt4 book ai didi

linux - grep -Po '...\K...' 有什么作用?否则如何达到这种效果?

转载 作者:可可西里 更新时间:2023-11-01 11:51:58 25 4
gpt4 key购买 nike

我有这个脚本script.sh:

#!/bin/bash
file_path=$1
result=$(grep -Po 'value="\K.*?(?=")' $file_path)
echo $result

和这个文件text.txt:

value="a"
value="b"
value="c"

当我运行 ./script.sh/file/directory/text.txt 命令时,终端中的输出如下:

a b c

我明白脚本的作用,但我不明白它是如何工作的,所以我需要对这部分命令的详细解释:

-Po 'value="\K.*?(?=")'

如果我没有理解错的话,\K 是一个 Perl 命令。你能给我一个 shell 的替代方案吗(例如使用 awk 命令)?


提前谢谢你。

最佳答案

  • grep -P 启用 PCRE 语法。 (这是一个非标准扩展——甚至不是所有的 GNU grep 构建都支持它,因为它依赖于可选的 libpcre 库,是否链接它是一个编译时选项)。
  • grep -o 在输出中只发出匹配的文本,而不是包含所述文本的整行。 (这也是非标准的,尽管比 -P 更广泛使用)。
  • \K 是正则表达式语法的 PCRE 扩展,它会丢弃匹配输出中包含的那一点之前的内容。

因为你的 shell 是 bash,你有内置的 ERE 支持。作为仅使用内置功能的替代方案(没有外部工具,grepawk 或其他):

#!/usr/bin/env bash
regex='value="([^"]*)"' # store regex (w/ match group) in a variable
results=( ) # define an empty array to store results
while IFS= read -r line; do # iterate over lines on input
if [[ $line =~ $regex ]]; then # ...and, when one matches the regex...
results+=( "${BASH_REMATCH[1]}" ) # ...put the group's contents in the array
fi
done <"$1" # with stdin coming from the file named in $1
printf '%s\n' "${results[*]}" # combine array results with spaces and print

参见 http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression =~http://wiki.bash-hackers.org/syntax/shellvars#bash_rematch 的讨论用于讨论 BASH_REMATCH。参见 BashFAQ #1有关使用 while read 循环逐行读取文件的讨论。

关于linux - grep -Po '...\K...' 有什么作用?否则如何达到这种效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com