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

时间:2016-11-10 17:31:47

标签: regex bash sed

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

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

但是当我执行时:

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

它正确捕获了Os Name,但它打印了所有其他只打印捕获字符串的行,为什么?

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"

只能输出的Sed命令" CentOS Linux"但它输出所有行:

$ 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"

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您不需要sed。只需grepcut即可。

$ grep "^NAME=" /etc/os-release | cut -d\= -f2