首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从行中删除模式

从行中删除模式
EN

Stack Overflow用户
提问于 2022-06-06 09:01:40
回答 3查看 61关注 0票数 1

我有一个包含网站列表的文件,并按这样的顺序引用:

代码语言:javascript
复制
      "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字符串直到: ",并在可能的情况下删除行尾的",。它可能需要双重执行,但让我们关注主要问题。预期的结果如下所示:

代码语言:javascript
复制
librarylab.law.harvard.edu
or
librarylab.law.harvard.edu",

任何剩馀的",都可以很容易地使用搜索替换删除.以下是我尝试过的:

代码语言:javascript
复制
sed "s/^*\:$//"
sed "s/^.*\:$//"
sed "/^.*#\://"
sed "s/^*\:$/d"
sed "s/^.*\:$/d"
sed -e "/^*/,s/\:/d"
and so-on...

所有这些都不会对目标文件进行任何更改。我真的很困惑;以下是我所理解的:

  • ^*^.*:标记任何第一个字符串。
  • \:$还是#\::标记结束字符串:
  • /d//:删除

任何帮助都是值得珍惜的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-06 09:09:03

如果未关闭的",的最后一行是一个错误,那么您可以使用

代码语言:javascript
复制
sed -E 's~^([0-9]+:)?[[:space:]]*"[^"]*":[[:space:]]*"([^"]+)",?$~\2~' file

在替换中,表示为\2的捕获组2作为捕获组1用于开头的可选部分。

模式匹配:

  • 字符串的^开始
  • ([0-9]+:)?可选择捕获第1组中的1+数字和:
  • [[:space:]]*匹配可选空间
  • 来自"[^"]*""....."匹配
  • :[[:space:]]*匹配:和可选空格
  • "([^"]+)"匹配",然后在第2组捕获双引号之间的所有内容,并匹配结束的双引号。
  • ,?匹配一个可选逗号
  • 字符串的$末端

输出

代码语言:javascript
复制
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. 
票数 1
EN

Stack Overflow用户

发布于 2022-06-06 09:08:28

您可以使用

代码语言:javascript
复制
sed -E 's/^([0-9]+:)?[[:space:]]*"[^"]*":[[:space:]]*"([^"]*).*/\2/' file > newfile

详细信息

  • ^ -字符串的开始
  • ([0-9]+:)? -一个或多个数字的可选序列,然后是一个:字符
  • [[:space:]]* -零或多个空白空间
  • " -双引号
  • [^"]* -除"以外的零个或多个字符
  • ": -一个":子字符串
  • [[:space:]]* -零或多个空白空间
  • " -a " char
  • ([^"]*) -第2组:除"以外的任何零或多个字符
  • .* -剩下的部分。

在线演示

代码语言:javascript
复制
#!/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"

输出:

代码语言:javascript
复制
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.
票数 0
EN

Stack Overflow用户

发布于 2022-06-06 11:48:00

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

代码语言:javascript
复制
sed -E 's/.* "([^"]*).*/\1/' file

使用贪婪删除所有向上和包括空格后双引号,捕获字符串,而不是双引号,并删除其余。

这个解决方案的实质是在一行中找到最后一个双引号字符串,然后丢弃其余的字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72515328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档