我有一个包含网站列表的文件,并按这样的顺序引用:
"ProxyHost": "ie.review.visa.com",
"ProxyHost": "ocasta.zendesk.com",
"ProxyHost": "dev.zemanta.com",
"ProxyHost": "bharian.api.useinsider.com",
"ProxyHost": "optout.service.mycard.visa.com",
"ProxyHost": "ir.newrelic.com",
"ProxyHost": "metabase.yoast.com",
4: "ProxyHost": "designdiscoveryya.gsd.harvard.edu",
18: "ProxyHost": "pls.law.harvard.edu",
32: "ProxyHost": "view.jquery.com",
46: "ProxyHost": "www.rmf.harvard.edu",
60: "ProxyHost": "execed.sph.harvard.edu",
74: "ProxyHost": "note.microsoft.com",
102: "ProxyHost": "librarylab.law.harvard.edu",
116: "ProxyHost": "api.jquery.com",
130: "ProxyHost": "pmsdn.目标是:删除any in-front字符串直到: ",并在可能的情况下删除行尾的",。它可能需要双重执行,但让我们关注主要问题。预期的结果如下所示:
librarylab.law.harvard.edu
or
librarylab.law.harvard.edu",任何剩馀的",都可以很容易地使用搜索替换删除.以下是我尝试过的:
sed "s/^*\:$//"
sed "s/^.*\:$//"
sed "/^.*#\://"
sed "s/^*\:$/d"
sed "s/^.*\:$/d"
sed -e "/^*/,s/\:/d"
and so-on...所有这些都不会对目标文件进行任何更改。我真的很困惑;以下是我所理解的:
^*或^.*:标记任何第一个字符串。\:$还是#\::标记结束字符串:/d或//:删除任何帮助都是值得珍惜的。
发布于 2022-06-06 09:09:03
如果未关闭的",的最后一行是一个错误,那么您可以使用
sed -E 's~^([0-9]+:)?[[:space:]]*"[^"]*":[[:space:]]*"([^"]+)",?$~\2~' file在替换中,表示为\2的捕获组2作为捕获组1用于开头的可选部分。
模式匹配:
^开始([0-9]+:)?可选择捕获第1组中的1+数字和:[[:space:]]*匹配可选空间"[^"]*"的"....."匹配:[[:space:]]*匹配:和可选空格"([^"]+)"匹配",然后在第2组捕获双引号之间的所有内容,并匹配结束的双引号。,?匹配一个可选逗号$末端输出
ie.review.visa.com
ocasta.zendesk.com
dev.zemanta.com
bharian.api.useinsider.com
optout.service.mycard.visa.com
ir.newrelic.com
metabase.yoast.com
designdiscoveryya.gsd.harvard.edu
pls.law.harvard.edu
view.jquery.com
www.rmf.harvard.edu
execed.sph.harvard.edu
note.microsoft.com
librarylab.law.harvard.edu
api.jquery.com
pmsdn. 发布于 2022-06-06 09:08:28
您可以使用
sed -E 's/^([0-9]+:)?[[:space:]]*"[^"]*":[[:space:]]*"([^"]*).*/\2/' file > newfile详细信息
^ -字符串的开始([0-9]+:)? -一个或多个数字的可选序列,然后是一个:字符[[:space:]]* -零或多个空白空间" -双引号[^"]* -除"以外的零个或多个字符": -一个":子字符串[[:space:]]* -零或多个空白空间" -a " char([^"]*) -第2组:除"以外的任何零或多个字符.* -剩下的部分。见在线演示
#!/bin/bash
s=' "ProxyHost": "ie.review.visa.com",
"ProxyHost": "ocasta.zendesk.com",
"ProxyHost": "dev.zemanta.com",
"ProxyHost": "bharian.api.useinsider.com",
"ProxyHost": "optout.service.mycard.visa.com",
"ProxyHost": "ir.newrelic.com",
"ProxyHost": "metabase.yoast.com",
4: "ProxyHost": "designdiscoveryya.gsd.harvard.edu",
18: "ProxyHost": "pls.law.harvard.edu",
32: "ProxyHost": "view.jquery.com",
46: "ProxyHost": "www.rmf.harvard.edu",
60: "ProxyHost": "execed.sph.harvard.edu",
74: "ProxyHost": "note.microsoft.com",
102: "ProxyHost": "librarylab.law.harvard.edu",
116: "ProxyHost": "api.jquery.com",
130: "ProxyHost": "pmsdn.'
sed -E 's/^([0-9]+:)?[[:space:]]*"[^"]*":[[:space:]]*"([^"]*).*/\2/' <<< "$s"输出:
ie.review.visa.com
ocasta.zendesk.com
dev.zemanta.com
bharian.api.useinsider.com
optout.service.mycard.visa.com
ir.newrelic.com
metabase.yoast.com
designdiscoveryya.gsd.harvard.edu
pls.law.harvard.edu
view.jquery.com
www.rmf.harvard.edu
execed.sph.harvard.edu
note.microsoft.com
librarylab.law.harvard.edu
api.jquery.com
pmsdn.发布于 2022-06-06 11:48:00
这可能对您有用(GNU sed):
sed -E 's/.* "([^"]*).*/\1/' file使用贪婪删除所有向上和包括空格后双引号,捕获字符串,而不是双引号,并删除其余。
这个解决方案的实质是在一行中找到最后一个双引号字符串,然后丢弃其余的字符串。
https://stackoverflow.com/questions/72515328
复制相似问题