我有以下文字
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
指定-
为输入分隔符,然后打印除最后两个字段之外的所有字段