在 (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\: \<(.*)\>"
我将如何正确地使用sed
or进行正则表达式匹配grep
?请注意,该grep -P
选项在我的 BSD UNIX 发行版中不可用。sed -E
但是,该选项可用。
我想/bin/sh
在 BSD 平台上的POSIX shell ( ) 中处理多行字符串并逐行迭代它。Bash 不包含在基本的 BSD 发行版中,并且拥有 GPL 许可证——所以我试图让它普遍使用/bin/sh
。
我找到了一个使用管道的解决方案,但是在常规/bin/sh
shell 中,这些是在单独的进程中处理的,这意味着以下内容不起作用:
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
。