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

时间:2015-02-11 15:03:18

标签: bash sed

http://website/2015,4-5; Title; Description [23-01, Nr, 2015,4/5]

我有一个类似于上面类似行的bash脚本。 它启动一个网站http://website/2015,4-5,并使用Firefox Description [23-01, Nr, 2015,4/5]保存它。

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

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

3 个答案:

答案 0 :(得分:1)

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

变体A:单斜杠

sed -e 's%^\(.*\[[^]/]*\)/%\1-%'

这会抓取\(…\)从行^开头到方括号\[的所有内容,后跟任意数量的非斜线,非近似方括号[^]/]* ,所有这些都后跟斜线,并用捕获的材料和短划线替换它。

变体B:多个斜杠

这需要sed循环来重复进行替换:

sed -e ':again' -e 's%^\(.*\[[^]/]*\)/%\1-%' -e 't again'

第一个-e参数创建标签again;第二个-e参数是替换正则表达式,与以前完全相同;第三个-e参数是条件跳转回标签again如果进行了替换。

示例输出(变体B)

$ 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 :(得分:0)

使用gawk为第3个arg匹配():

$ 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]并删除该块中的所有/,然后再将该行重新组合在一起。

答案 2 :(得分:0)

我解决了我的问题,想让你知道。 刚刚发现已经有了或多或少相同解决方案的响应和一些关于它的解释,这是我使用的和你的explenation我开始理解它甚至更好。感谢名单

sed -e:1 -e' s @([。)/(。])@ \ 1,\ 2 @; t1'

相关问题