繁体   English   中英

Bash sed将字符串与上下换行符匹配

[英]Bash sed match a string with newlines above and below

这是一个文本文件的摘录。

http_server = Server(
    uuid = "9a44b850-c54f-11e3-9c1a-0800200c9a66",
)

# https_server = Server(
#     uuid = "0c9cb0c0-c55e-11e3-9c1a-0800200c9a66",
# )

我想使用sed(或类似方法)从文件中提取“ 0c9cb0c0-c55e-11e3-9c1a-0800200c9a66”。

我已经尝试过cat server.conf | sed -n 's/.*uuid = "\\(.*\\)",/\\1/p' cat server.conf | sed -n 's/.*uuid = "\\(.*\\)",/\\1/p'但这给了我两个uuid。 当我输入\\n之类的换行符时,sed根本不起作用。

uuid的唯一标记是https_server ,正则表达式必须确保uuid位于https_server

尝试以下方法:

cat server.conf | sed -n -e '/https_server/{N;p}' | sed -n -e 's/.*uuid = "\([^ ]*\)",/\1/p'

或此调用sed仅一次:

cat server.conf | sed -n -e '/https_server/{N;s/.*uuid = "\([^ ]*\)",/\1/p}'

或者,如果块内的https_server和uuid行之间有多个空行:

cat server.conf | sed -n -e '/https_server/,/uuid/p' | sed -n -e 's/.*uuid = "\([^ ]*\)",/\1/p'

为了确保uuidhttps_server内部,您可以跳过所有行,直到到达该字符串:

cat server.conf | sed -n '/https_server/,//{//!p}' | sed -n 's/.*uuid = "\(.*\)",/\1/p'

此代码查找可能被注释掉的https_server行,然后https_server一个https_server括号之前的块中提取所有uuid

sed -n '/^#* *https_server *=.*(/,/)/!d;/^#* *uuid *= *"/!d;s///;s/",//p' searver.conf

这样可以避免不必要地使用cat以及愚蠢的多重sed调用。

/regex/,/regex/

选择一个区域。 动作!d只是丢弃该区域之外的任何行。

/^ *uuid *= *"/

选择与该模式匹配的区域中的任何行。 同样, !d丢弃任何未选择的行。

s///

删除以前匹配的模式。

最后,

s/",//

删除字符串末尾的引号和逗号。

某些sed方言可能希望您在反义括号内加反斜杠。

这可能对您有用(GNU sed):

sed -rn '/https_server/{n;s/.*uuid = "([^"]*)".*/\1/p;q}' server.conf

如果uuid不在下一行,而是在下一行,请使用:

sed -rn '/https_server/{:a;n;/\)\s*$/b;s/.*uuid = "([^"]*)".*/\1/p;Ta;q}' server.conf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM