【问题标题】:Replace a single character in the text between two brackets在两个括号之间替换文本中的单个字符
【发布时间】:2015-02-12 20:03:25
【问题描述】:
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 不再起作用。

【问题讨论】:

  • 你的预期输出是什么?

标签: bash sed


【解决方案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 的版本之间有所不同)。

【讨论】:

    【解决方案2】:

    使用 gawk 作为第三个参数来匹配():

    $ 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])并删除其中的所有/s在将线路重新组合在一起之前阻止。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 2022-11-27
        • 2016-09-18
        • 2015-08-26
        • 2021-07-23
        • 2019-12-25
        相关资源
        最近更新 更多