gpt4 book ai didi

sed - 匹配一行并返回包含模式的匹配之前的前一行

转载 作者:行者123 更新时间:2023-12-03 23:34:43 26 4
gpt4 key购买 nike

我正在编写一个 bash 脚本,它在一个包含多个条目的文件中,每个条目都有这样的结构:

Id: 33239
Folder: /Contacts/Holder/Center
Date: 04/17/20 13:17
Revision: 34011
Attrs:
firstName: Name
lastName: First Second
mobilePhone: +345555555
fileAs: 2
jobTitle: Médico
company: some company
email: test_1@somedomain.com

我需要找到与特定“电子邮件”关联的项目的“ID”。为此,我正在尝试使用“sed”进行暂停。但是我没有达到我的目标。这是我到目前为止所拥有的,但我没有得到我需要的结果。

id=$(grep $usuario -B20 /tmp/contactos \
| grep "Folder: /Contacts/Holder" -B2 -A20 \
| sed -n "/^Id: /h;/^ email: $usuario/{g;p;}" \
| awk '{print $2}')

我正在尝试这样做:

id= - 将值分配给我稍后将在脚本中使用的变量

$(grep $usuario -B20/tmp/contactos - 获取文件中出现电子邮件的所有行,以及之前的 20 行。这是因为电子邮件显示为关联有多个 Id 在 `Id 本身下面的行数不确定。

grep 'Folder:/Contacts/Holder' -B2 -A20 - 我再次过滤,现在尝试仅获取特定“文件夹路径”中该电子邮件的 ID 的结果。

sed -n '/^Id:/h;/^ email: $usuario/{g;p;} - 这是不工作的部分,我不知道如何要解决这个问题。在这里,我尝试返回包含与电子邮件关联的 Id: 的行。类似: Id: 33239 在这个例子中。

awk '{print $2}') - 只是我试图仅打印该行中的数字 (33239)。

任何人都可以帮助了解我如何使用 sed` 来做这件事,或者如果给出任何其他选项,它也将非常受欢迎:)

非常感谢!

最佳答案

这个 sed 命令应该提取它:

sed -n '
/^Id: / { # If the line starts with "Id: "
s/// # Remove the "Id: "
h # Store what is left in the hold space
}
/^ email: '"$email"'/ { # If the line starts with " email: " plus the email
x # Swap pattern and hold space
p # Print pattern space
q # Stop processing
}
' infile

其中 $email 是包含 test_1@somedomain.com 的转义版本的 shell 变量:

raw='test_1@somedomain.com'
email=$(sed 's|[]/.*^$\[]|\\&|g' <<< "$raw")

这会转义 sed 特殊字符 .*/^$[]\.

或者,更紧凑:

sed -n '/^Id: /{s///;h};/^  email: '"$email"'/{x;p;q}' infile

macOS sed 需要一个额外的 ; 在每个关闭 } 之前。

是的,使用 awk 可能会更容易 😉

关于sed - 匹配一行并返回包含模式的匹配之前的前一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61271652/

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