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不再起作用。
发布于 2015-02-11 23:25:31
你的问题还不是很清楚,尤其是因为你还没有显示出你想要的输出。但是,如果目标是将方括号之间的所有斜杠替换为短划线(为了具体起见),则可以使用此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
版本的不同而不同)。
发布于 2015-02-12 06:41:43
将gawk用于第三个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]
中),并在将该行重新组合在一起之前删除该块中的所有/
。
发布于 2015-02-12 20:03:25
我解决了我的问题,并想让你知道它。我刚发现已经有一些回复,或多或少有相同的解决方案和一些关于它的解释,这就是我使用的,有了你的解释,我开始更好地理解它。谢谢
sed -e :1 -e 's@(.)/(.)@\1,\2@;t1‘
https://stackoverflow.com/questions/28457554
复制相似问题