使用sed删除[[:space:]]之后的所有内容

3

如何在空格后面删除所有内容?如果我指定冒号“:”而不是[[:space:]],我可以做到这一点。

$ cat t.sh
echo "DW_Prod\\Facets\\UNRCH_MBRS: UNRCH_Members.sql" | \
    sed -r -e 's#.*\(DW_Prod.*\)[[:space:]].*#\\1#'

$ ./t.sh
DW_Prod\Facets\UNRCH_MBRS: UNRCH_Members.sql

1
附注:您无需在管道后转义换行符。 - Benjamin W.
1
去掉保持模式的sed标志和双重转义:echo "DW_Prod\\Facets\\UNRCH_MBRS: UNRCH_Members.sql" | sed 's#.*\(DW_Prod.*\)[[:space:]].*#\1#' - user4401178
大家都给出了很棒的答案。我把第一个按时间顺序标记为答案。非常感谢。 - lit
你可能想要思考一下你得到的答案,而不是仅仅选择第一个能够从给定的样本输入集中产生你期望输出的答案。这些答案之间存在着显著的差异。如果你无法通过阅读答案来判断它们的不同之处,那么可以看看其他人的赞数。如果你不确定其中的区别,那么你应该提出问题。我并不希望你因为我发表了这个评论就突然接受我的答案,我只是建议你真正思考任何解决方案,而不是仅仅接受第一个。 - Ed Morton
3个回答

3

您正在使用-r启用ERE元字符,然后通过转义定界符\(...\)来禁用ERE捕获组(...),并通过转义反斜杠\\1来禁用反向引用\1。请尝试以下操作:

$ echo "DW_Prod\\Facets\\UNRCH_MBRS: UNRCH_Members.sql" | \
    sed -r -e 's#.*(DW_Prod.*)[[:space:]].*#\1#'
DW_Prod\Facets\UNRCH_MBRS:

你真正需要的只有:

$ echo "DW_Prod\\Facets\\UNRCH_MBRS: UNRCH_Members.sql" |
    sed 's#[[:space:]].*##'
DW_Prod\Facets\UNRCH_MBRS:

1
你可以使用 grep -o(精确匹配)和一个非空格的正则表达式:
grep -o '^[^ ]*' <<< "DW_Prod\\Facets\\UNRCH_MBRS: UNRCH_Members.sql"

0

删除空格后面的所有内容,即:

echo "DW_Prod\\Facets\\UNRCH_MBRS: UNRCH_Members.sql" | sed -r 's/([[:space:]]+).*/\1/'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接