在 Unix 中删除模式后的所有内容

Deleting everything after a pattern in Unix

我有一个字符串 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 之前的逗号?

试试这个:

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

请注意 .* 之后删除的 space 和整个命令周围的双引号。

因为你想删除变量和它前面的逗号所以遵循 sed 可能对你有帮助。

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

sed 显然可以在这里工作:

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

输出:

replenishment_category string

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

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