我找到了几种删除两个字符串之间文本的解决方案,但我想我的情况有点不同。
我正在尝试转换它:
/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume
对此:
/nz/kit/bin/adm/tools/hostaekresume
基本上从文件名中删除特定于版本的信息。
我找到的解决方案删除了从单词 kit
到 last /
出现的所有内容。我需要从 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
中的pattern
被string<替换
。如果我们使用 //
而不是 /
,那么所有出现的地方都会被替换,而不仅仅是第一个。
在我们的例子中,parameter
是 var
,模式是 [[:digit:].]
(数字或点 - 这顺便说一句,是一个 glob 模式,而不是正则表达式),我们跳过了 /string
部分,它只是删除了模式(什么都没有替换)。
关于linux - 删除一个字符串和另一个字符串第一次出现之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37889615/