首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换文本中两个括号之间的单个字符

替换文本中两个括号之间的单个字符
EN

Stack Overflow用户
提问于 2015-02-11 23:03:18
回答 3查看 135关注 0票数 0
代码语言:javascript
运行
复制
http://website/2015,4-5; Title; Description [23-01, Nr, 2015,4/5]

我有一个类似于上面代码行的bash脚本。它会启动一个网站http://website/2015,4-5,并用火狐将其保存为Description [23-01, Nr, 2015,4/5]

文件名中的正斜杠是它出错的地方;有谁有建议如何解决这个问题吗?

我喜欢用sed替换文本,并且已经用2015替换了2015/,只需替换所有正斜杠就会导致url不再起作用。

EN

回答 3

Stack Overflow用户

发布于 2015-02-11 23:25:31

你的问题还不是很清楚,尤其是因为你还没有显示出你想要的输出。但是,如果目标是将方括号之间的所有斜杠替换为短划线(为了具体起见),则可以使用此sed脚本。

变体A:单个斜杠

代码语言:javascript
运行
复制
sed -e 's%^\(.*\[[^]/]*\)/%\1-%'

这将捕获所有内容,从行^的开头到方括号\[,然后是任意数量的非斜杠、非闭方括号[^]/]*,所有这些内容都是斜杠,并将其替换为捕获的材料和破折号。

变体B:多个斜杠

这需要一个sed循环来重复执行替换:

代码语言:javascript
运行
复制
sed -e ':again' -e 's%^\(.*\[[^]/]*\)/%\1-%' -e 't again'

第一个-e参数创建一个标签again;第二个-e参数是与前面完全相同的替代正则表达式;第三个-e参数是有条件地跳回标签again (如果进行了替代)。

示例输出(变体B)

代码语言:javascript
运行
复制
$ echo "http://website/2015,4-5; Title; Description [23-01, Nr, 2015/4/5] / x23" |
>     sed -e ':again' -e 's%^\(.*\[[^]/]*\)/%\1-%' -e 't again'
http://website/2015,4-5; Title; Description [23-01, Nr, 2015-4-5] / x23
$

后面的/ x23只是为了演示脚本所做的更改是由方括号限定的。如果您添加了几组内含斜杠的方括号,则所有这些斜杠都将被短划线替换。

某些版本的sed (GNU sed)可能允许您将这三个-e表达式组合到一个参数中。其他版本则不能。所显示的版本应该适用于任何版本的sed。它也不使用扩展正则表达式(因为不迫切需要它们,而且激活它们的选项因sed版本的不同而不同)。

票数 1
EN

Stack Overflow用户

发布于 2015-02-12 06:41:43

将gawk用于第三个arg以匹配():

代码语言:javascript
运行
复制
$ awk 'match($0,/(.*)(\[[^]]+\])(.*)/,a) { gsub("/","",a[2]); $0=a[1] a[2] a[3] }1' file
http://website/2015,4-5; Title; Description [23-01, Nr, 2015,45]

上面的match()只是将[...]之间的文本块提取到a[2]中(并将其之前/之后的文本分别放入a[1]a[3]中),并在将该行重新组合在一起之前删除该块中的所有/

票数 0
EN

Stack Overflow用户

发布于 2015-02-12 20:03:25

我解决了我的问题,并想让你知道它。我刚发现已经有一些回复,或多或少有相同的解决方案和一些关于它的解释,这就是我使用的,有了你的解释,我开始更好地理解它。谢谢

sed -e :1 -e 's@(.)/(.)@\1,\2@;t1‘

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

https://stackoverflow.com/questions/28457554

复制
相关文章

相似问题

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