使用特定值 (-) 删除字符串

使用特定值 (-) 删除字符串

我有以下文字

foo-11.11-fo.o-foo-bar

酒吧-foo-11.11-22.11

我想删除最后一个有两个“-”的字符串。

预期输出:

foo-11.11-fo.o

酒吧富

我尝试了多种使用 cut 的方法,但没有任何效果。

答案1

使用sed

$ sed 's/-[^-]*-[^-]*$//' file
foo-11.11-fo.o
bar-foo

这将删除-X-X中每一行的末尾file,其中X是不包含 的任何字符串-

如果字符串位于 shell 变量中:

$ s='foo-11.11-fo.o-foo-bar'
$ printf '%s\n' "${s%-*-*}"
foo-11.11-fo.o

$ s='bar-foo-11.11-22.11'
$ printf '%s\n' "${s%-*-*}"
bar-foo

或在bash数组中:

$ s=( 'foo-11.11-fo.o-foo-bar' 'bar-foo-11.11-22.11' )
$ printf '%s\n' "${s[@]%-*-*}"
foo-11.11-fo.o
bar-foo

这将通过后缀模式匹配/删除来删除-*-*与变量中字符串末尾的模式匹配的任何内容。在数组中的s情况下s,删除是对数组的所有元素进行的。

答案2

$ cat ip.txt 
foo-11.11-fo.o-foo-bar
bar-foo-11.11-22.11

$ rev ip.txt
rab-oof-o.of-11.11-oof
11.22-11.11-oof-rab

$ rev ip.txt | cut -d- -f3- | rev
foo-11.11-fo.o
bar-foo

反转每一行,然后使用cut选择除前两个字段之外的所有字段,然后再次反转输出


您也可以使用perl, 但如果任何输入行的字段少于 3 个,则会打印空行

$ perl -F'-' -lane 'print join "-", @F[0..$#F-2]' ip.txt 
foo-11.11-fo.o
bar-foo

指定-为输入分隔符,然后打印除最后两个字段之外的所有字段

相关内容