linux - 删除一个字符串和另一个字符串第一次出现之间的文本

标签 linux awk sed

我找到了几种删除两个字符串之间文本的解决方案,但我想我的情况有点不同。

我正在尝试转换它:

/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume

对此:

/nz/kit/bin/adm/tools/hostaekresume

基本上从文件名中删除特定于版本的信息。 我找到的解决方案删除了​​从单词 kitlast / 出现的所有内容。我需要从 kit 中删除一些东西以防止第一次出现。

我见过的最常见的解决方案是:

sed -e 's/\(kit\).*\(\/\)/\1\2/'

产生:

/nz/kit/hostaekresume

我怎样才能只删除第一个 /?我认为这可以通过 sed 或 awk 完成,但欢迎提出建议。

最佳答案

$ sed 's|\(kit\)[^/]*|\1|' <<< '/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume'
/nz/kit/bin/adm/tools/hostaekresume

这使用了不同的分隔符(| 而不是 /)所以我们不必转义 /。然后,对于非贪婪匹配,它使用 [^/]*:除 / 之外的任意数量的字符 ,它匹配 kit 和下一个 /.

或者,如果您知道要删除的内容由点和数字组成,并且字符串中没有其他内容包含它们,则可以使用 parameter expansion :

$ var='/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume'
$ echo "${var//[[:digit:].]}"
/nz/kit/bin/adm/tools/hostaekresume

语法为${parameter/pattern/string},其中展开的parameter中的patternstring<替换。如果我们使用 // 而不是 /,那么所有出现的地方都会被替换,而不仅仅是第一个。

在我们的例子中,parametervar,模式是 [[:digit:].](数字或点 - 这顺便说一句,是一个 glob 模式,而不是正则表达式),我们跳过了 /string 部分,它只是删除了模式(什么都没有替换)。

关于linux - 删除一个字符串和另一个字符串第一次出现之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37889615/

相关文章:

linux - 从尾部匹配 awk 时增加变量

linux - 每月获取第一个和最后一个文件

linux - Bash:如何在跳过 key=value 的特定实例时始终如一地替换等号后面的内容?

linux - 更改文件时间(触摸)

c - 更新终端上显示的文本

regex - sed 中的后置代码过滤器

bash - Shell 脚本 - 运行正则表达式来修改文件,其中包括文件名

macos - sed: c 命令,只改变第一行,文本被删除

linux - 在 glibc 源代码中找不到 puts()

python - 我可以将 ati opencl 与混合显卡一起使用吗 (intel/ati)