【问题标题】:Deleting everything after a pattern in Unix在 Unix 中删除模式后的所有内容
【发布时间】:2018-05-29 12:20:53
【问题描述】:

我有一个字符串replenishment_category string,Date string,我想删除以Date 开头的所有内容(包括它),如果存在的话,还要删除它前面的逗号。

我将要替换的字符串存储在一个变量中:

PARTITION_COLUMN='Date'

我尝试用sed 替换变量PARTITION_COLUMN 之后的所有内容

echo "replenishment_category string,Date string" | sed "s/"$PARTITION_COLUMN".* //g"

但输出仍然有日期后面的字符串:

replenishment_category string,string

如何删除string 部分以及Date 前面的逗号?

【问题讨论】:

  • 有什么理由不赞成这个问题吗?

标签: regex unix sed substitution


【解决方案1】:

试试这个:

echo "replenishment_category string,Date string" | sed "s/$PARTITION_COLUMN.*//"

注意.* 之后删除的空格以及整个命令周围的双引号。

【讨论】:

  • 它有效,是的,空间是问题,有没有办法删除前面的','因为最后的o / p只有“replenishment_category string”而不是“replenishment_category string”,
  • 是的,使用:"s/,$PARTITION_COLUMN.*//"
【解决方案2】:

假设您启用了扩展 glob (shopt -s extglob),您可以单独使用 shell 参数扩展来做到这一点:

$ var='replenishment_category string,Date string'
$ part_column=Date
$ echo "${var%%?(,)"$part_column"*}"
replenishment_category string
  • ${word%%<em>pattern</em>} 扩展在没有扩展 glob 的情况下工作,并从 $word 的末尾删除最长的匹配 pattern
  • ?(<em>pattern</em>) 扩展模式匹配零次或一次出现的 pattern,用于删除逗号(如果存在)。
  • "$part_column"* 匹配任何以 $part_column 扩展开头的字符串。示例中不需要引用它,但这是防止全局字符扩展的良好做法。

【讨论】:

    【解决方案3】:

    由于您想删除变量以及它之前的逗号,所以关注sed 可能会帮助您。

    echo "replenishment_category string,Date string" | sed "s/,$PARTITION_COLUMN.*//g"
    

    【讨论】:

    • 投反对票,请在这里告诉我投反对票的原因??
    【解决方案4】:

    sed 显然可以在这里工作:

    echo "replenishment_category string,Date string" | sed "s/\b,$PARTITION_COLUMN.*//"

    输出:

    replenishment_category string

    【讨论】:

    • OP 已特别要求在sed 命令中使用shell 变量。
    • 变量不会扩展,因为它是单引号。单引号内的双引号不会改变这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 2016-12-08
    • 2015-07-07
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多