Linux 删除一个字符串和另一个字符串第一次出现之间的文本
我已经找到了几种方法来删除两个字符串之间的文本,但我想我的情况有点不同 我正在尝试转换以下内容:Linux 删除一个字符串和另一个字符串第一次出现之间的文本,linux,awk,sed,Linux,Awk,Sed,我已经找到了几种方法来删除两个字符串之间的文本,但我想我的情况有点不同 我正在尝试转换以下内容: /nz/kit.7.2.0.7/bin/adm/tools/hostaekresume 为此: /nz/kit/bin/adm/tools/hostaekresume 基本上从文件名中删除特定于版本的信息。 我找到的解决方案删除了从单词kit到最后出现的/的所有内容。我需要从kit中删除一些内容,直到第一次出现 我见过的最常见的解决方案是: sed -e 's/\(kit\).*\(\/\)/\
/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume
为此:
/nz/kit/bin/adm/tools/hostaekresume
基本上从文件名中删除特定于版本的信息。
我找到的解决方案删除了从单词kit
到最后出现的/
的所有内容。我需要从kit
中删除一些内容,直到第一次出现
我见过的最常见的解决方案是:
sed -e 's/\(kit\).*\(\/\)/\1\2/'
产生:
/nz/kit/hostaekresume
如何最多只能删除第一个
/
?我假设这可以用sed或awk来完成,但是可以接受建议。对于非贪婪正则表达式,您需要perl
sed
还没有这样做。
另外,使用|
作为分隔符,因为/
在正则表达式中时可能会导致混淆
perl-pe的|(kit)。*?(/.*)|\1\2 |'
*
后面的?
使模式非贪婪,并将匹配/
的第一个实例
echo”/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume“| perl-pe的|(kit)。*?(/.*)|\1\2 |”
返回值
/nz/kit/bin/adm/tools/hostaekresume
$ sed 's|\(kit\)[^/]*|\1|' <<< '/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume'
/nz/kit/bin/adm/tools/hostaekresume
语法为${parameter/pattern/string}
,其中展开的参数
中的模式
替换为字符串
。如果我们使用/
而不是/
,则会替换所有引用,而不仅仅是第一个引用
在我们的例子中,
参数
是var
,模式是[[:digit:][.]
(数字或点–顺便说一下,这是一个全局模式,不是正则表达式),我们跳过了/string
部分,它只是删除了模式(将其替换为零).我想我应该提到我不知道7.2.0.7的位置会有什么,所以我无法搜索。我只知道它以“kit”开头,以第一个“/”结尾。
$ var='/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume'
$ echo "${var//[[:digit:].]}"
/nz/kit/bin/adm/tools/hostaekresume
echo "/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume" | awk '{sub(/.7.2.0.7/,"")}1'
/nz/kit/bin/adm/tools/hostaekresume