小编Ste*_*ner的帖子

使用 sed 或 grep 根据正则表达式提取子字符串

在 (BSD) UNIX 环境中,我想使用正则表达式捕获特定的子字符串。

假设dmesg命令输出将包括以下行:

pass2: <Marvell Console 1.01> Removable Processor SCSI device
Run Code Online (Sandbox Code Playgroud)

我想捕获<>字符之间的文本,例如

dmesg | <sed command>

应该输出:

Marvell Console 1.01
Run Code Online (Sandbox Code Playgroud)

但是,如果正则表达式不匹配,则不应输出任何内容。许多解决方案包括sed -e 's/$regex/\1/如果找不到匹配项,将输出整个输入,这不是我想要的。

相应的正则表达式可能是: regex="^pass2\: \<(.*)\>"

我将如何正确地使用sedor进行正则表达式匹配grep?请注意,该grep -P选项在我的 BSD UNIX 发行版中不可用。sed -E但是,该选项可用。

grep sed regular-expression

5
推荐指数
2
解决办法
5818
查看次数

逐行遍历多行字符串

我想/bin/sh在 BSD 平台上的POSIX shell ( ) 中处理多行字符串并逐行迭代它。Bash 不包含在基本的 BSD 发行版中,并且拥有 GPL 许可证——所以我试图让它普遍使用/bin/sh

我找到了一个使用管道的解决方案,但是在常规/bin/shshell 中,这些是在单独的进程中处理的,这意味着以下内容不起作用:

MULTILINE="`cat ${SOMEFILE}`"
SOMEVAR="original value"

echo "${MULTILINE}" | while IFS= read -r SINGLELINE
do
 SOMEVAR="updated value"
 echo "this is a single line: ${SINGLELINE}"
 echo "SOMEVAR is now: ${SOMEVAR}"
done

echo "Final SOMEVAR is unchanged: ${SOMEVAR}"
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,它完成了我想要的,除了${SOMEVAR}在 while 循环之外无法访问对诸如此类的变量的更改这一事实。

我的问题:如何在没有此限制的情况下完成上述操作?请注意,许多解决方案需要 Bash,而我使用的是标准 POSIX-shell /bin/sh

shell

2
推荐指数
1
解决办法
2933
查看次数

标签 统计

grep ×1

regular-expression ×1

sed ×1

shell ×1