首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Sed在grep后使用HTML前缀替换内联

使用Sed在grep后使用HTML前缀替换内联
EN

Stack Overflow用户
提问于 2021-04-16 17:51:03
回答 2查看 106关注 0票数 1

我有一些文本,我想用一个实际的链接来代替。

案文如下:

代码语言:javascript
复制
Some text here 
[...]
-   CRAN Task View: [Bayesian](Bayesian.html)
-   CRAN Task View: [Cluster](Cluster.html)
-   CRAN Task View: [Databases](Databases.html)
-   CRAN Task View: [Environmetrics](Environmetrics.html)
[...]
End of text here

但是正如您所看到的,没有指向页面的HTML链接。例如,Bayesian.html应该是http://cran.rstudio.com/web/views/Bayesian.html

最终结果应该是

代码语言:javascript
复制
Some text here 
[...]
-   CRAN Task View: [Bayesian](http://cran.rstudio.com/web/views/Bayesian.html)
-   CRAN Task View: [Cluster](http://cran.rstudio.com/web/views/Cluster.html)
-   CRAN Task View: [Databases](http://cran.rstudio.com/web/views/Databases.html)
-   CRAN Task View: [Environmetrics](http://cran.rstudio.com/web/views/Environmetrics.html)
[...]
End of text here

到目前为止,我能够使用以下命令“子集”我的文本文件:

代码语言:javascript
复制
grep "CRAN Task View: \[" $FILE

但当我试着说这句话时:

代码语言:javascript
复制
sed -e 's|\\([a-zA-Z]*\\)\\.html|http://cran.rstudio.com/web/views/\\1.html|'

它不起作用。如何能够从grep命令内联sed?

我在macOS莫哈韦。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-16 18:18:06

这个sed应该适用于您:

代码语言:javascript
复制
sed -E '/CRAN Task View:/s~\(([^)]+)\)~(http://cran.rstudio.com/web/views/\1)~' file

Some text here
[...]
-   CRAN Task View: [Bayesian](http://cran.rstudio.com/web/views/Bayesian.html)
-   CRAN Task View: [Cluster](http://cran.rstudio.com/web/views/Cluster.html)
-   CRAN Task View: [Databases](http://cran.rstudio.com/web/views/Databases.html)
-   CRAN Task View: [Environmetrics](http://cran.rstudio.com/web/views/Environmetrics.html)
[...]
End of text here

RegEx详细信息:

  • /CRAN Task View:/:只在行匹配文本"CRAN Task View:"
  • s~:Substitute
  • \(:匹配(
  • ([^)]+):匹配组#1
  • \):匹配的1+非)字符的情况下才会替换使用反向引用#1

创建链接的)

  • (http://cran.rstudio.com/web/views/\1)
票数 4
EN

Stack Overflow用户

发布于 2021-04-16 18:11:28

sed -e 's|\\([a-zA-Z]*\\)\\.html|http://cran.rstudio.com/web/views/\\1.html|',它不工作。

这是一个引证问题。在单引号中,'...'反斜杠\不需要转义。Bash将'\\('解析为\\(,并将其发送给sed,后者将其解释为文字字符串\(。因此,您要替换文件中从未出现的文字字符串\(someLetters\)\.html " "

你可能是说sed 's|\([a-zA-Z]*\)\.html|http://cran.rstudio.com/web/views/\1.html|'

顺便说一句:sed也可以为您完成grep部分。另外,对于-E,您需要更少的反斜杠。但是,由于再次追加.html,所以首先不需要组\(....\)

代码语言:javascript
复制
sed -E -n '/CRAN Task View: \[/s|[a-zA-Z]*\.html|http://cran.rstudio.com/web/views/&|p'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67129993

复制
相关文章

相似问题

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