替换字符串(bash)中子字符串的最后一次出现

时间:2018-06-26 14:33:02

标签: bash shell pattern-matching substring variable-expansion

从bash软件手册中:

  

month, hour, day = string.split(' ') month = int(month); hour = int(hour)

     

模式被扩展以产生一个   模式与文件名扩展一样。展开参数,然后   模式与其值的最长匹配项将替换为字符串。
  ...如果格式以“ ${parameter/pattern/string}”开头,则必须匹配   在参数扩展值的末尾。

所以我尝试了:

%

其中字符串是绝对文件路径(local new_name=${file/%old/new} 以及/abc/defg/hijold是可变字符串。

但是,这似乎试图匹配文字new

这是什么语法?

预期输出:

给出

%sb1

然后

old=sb1 new=sb2 应该成为/foo/sb1/foo/bar/sb1

/foo/sb1/foo/bar/sb2应该成为/foo/foosb1other/foo/bar/foosb1bar

1 个答案:

答案 0 :(得分:3)

仅使用内置parameter expansion的shell:

src=sb1; dest=sb2
old=/foo/foosb1other/foo/bar/foosb1bar

if [[ $old = *"$src"* ]]; then
  prefix=${old%"$src"*}                  # Extract content before the last instance
  suffix=${old#"$prefix"}                # Extract content *after* our prefix
  new=${prefix}${suffix/"$src"/"$dest"}  # Append unmodified prefix w/ suffix w/ replacement
else
  new=$old
fi

declare -p new >&2

...正确发射:

declare -- new="/foo/foosb1other/foo/bar/foosb2bar"