我找到了如何打印斜杠之前的所有内容,但是我需要打印斜杠之后的所有内容。我有一个像这样的字符串blablabal/important
,我只需要打印important
.我应该如何修改下面的行以打印斜杠之后而不是之前的所有内容?
sed 's:/[^/]*$::'
答案1
只需删除最后一个斜杠之前的所有内容:
$ echo "blablabal/important" | sed 's:.*/::'
important
它也适用于多个斜杠:
$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important
答案2
看起来其他答案假设您在一个文件中有多行数据,这些数据都需要处理。在这种情况下sed
或awk
(或可能cut
)将是一次性处理所有行的最佳工具。
但是,如果 shell 变量中只有一行(假设您正在使用bash
),则可以使用 shell 扩展来实现所需的结果,而无需在外部进程中生成实用程序:
$ var="interesting/bla/blablabal/important"
$
$ # everything after the first slash:
$ echo "${var#*/}"
bla/blablabal/important
$ # everything after the last slash:
$ echo "${var##*/}"
important
$ # everything before the first slash:
$ echo "${var%%/*}"
interesting
$ # everything before the last slash:
$ echo "${var%/*}"
interesting/bla/blablabal
$
或者,我假设您的斜杠分隔的字符串是文件路径。如果是这种情况,您可以使用dirname
和basename
来获取路径和文件名部分:
$ # everything before the last slash:
$ dirname "$var"
interesting/bla/blablabal
$ # everything after the last slash:
$ basename "$var"
important
$
答案3
既然您在评论中提到该文件只有一个斜杠,为什么不直接使用 呢awk
?
例子:
❱ echo "blablabal/important" | awk -F'/' '{print $1}'
blablabal
❱ echo "blablabal/important" | awk -F'/' '{print $2}'
important
答案4
sed -et -e's|/|&\n|;//D' <in >out
...将打印包含斜杠的任何行上第一个斜杠之后的所有内容,否则打印任何其他未修改的内容。如果你删除它,//
它只会打印它修改的行。
您可能需要使用文字\n
ewline 代替n
不过\n
,取决于您的sed
版本。
另外,如果您指定出现次数...
sed -et -e's|/|&\n|num;/\n/D'
...您最多可以删除编号一行上的斜杠不影响任何不包含至少编号斜杠。