gpt4 book ai didi

regex - 如何从多行文件中提取子字符串

转载 作者:行者123 更新时间:2023-12-04 01:50:24 28 4
gpt4 key购买 nike

我正在尝试从/etc/os-release 中提取操作系统名称,其中包含:

...
NAME="Os Name"
...

但是当我执行时:

sed 's/.*NAME="\([^"]*\).*/\1/' /etc/os-release

它正确地捕获了操作系统名称,但它打印了所有其他行而不是只打印捕获的字符串,为什么?

操作系统发布文件的内容

cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

应该只输出“CentOS Linux”但输出所有行的 Sed 命令:

$ sed 's/.*NAME="\([^"]*\).*/\1/' /etc/os-release
CentOS Linux
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
CentOS Linux 7 (Core)
ANSI_COLOR="0;31"
cpe:/o:centos:centos:7
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

最佳答案

您可以使用 -n 选项来抑制常规输出,并在 s 命令中使用 /p 模式在特定行上打印结果:

sed -nE 's/^NAME="([^"]+)".*/\1/p' /etc/os-release

CentOS Linux

你也可以使用awk:

awk -F '["=]+' '$1=="NAME"{print $2}' /etc/os-release

CentOS Linux

或者使用 grep -oP:

grep -oP '^NAME="\K[^"]+' /etc/os-release

关于regex - 如何从多行文件中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40533715/

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