bash - 从右侧替换目录字符串的简便方法

时间:2018-01-16 18:33:04

标签: string bash awk sed

我想知道是否有一个简单的方法来处理这个问题:从字符串的右侧找到一个模式,然后替换它的右侧。 例如:

PATTERN='bin'
REPLACE_TO='dev/zero'
STRING='/bin/bash/bin/test/test1.txt'

我们发现STRING中PATTERN的最后一个索引是2,然后用REPLACE_TO替换它。结果是:

STRING='bin/bash/dev/zero'

我知道我可以编写一个函数来做到这一点,不确定是否有一个使用sed / awk / others来制作它的东方方式。

2 个答案:

答案 0 :(得分:4)

你可以这样做:

PATTERN='bin'
REPLACE_TO='dev/zero'
STRING='/bin/bash/bin/test/test1.txt'
echo "${STRING%$PATTERN*}$REPLACE_TO"

/bin/bash/dev/zero

${STRING%$PATTERN*}会移除以$STRING开头的$PATTERN的右侧。

答案 1 :(得分:0)

使用sed:

#!/bin/bash
PATTERN='bin'
REPLACE_TO='dev/zero'
STRING='/bin/bash/bin/test/test1.txt'

#Escape PATTERN and REPLACE_TO
PATTERN=$(sed -e 's/[][\/&*?+.^${}]/\\&/g' <<< "$PATTERN")
REPLACE_TO=$(sed -e 's/[][\/&*?+.^${}]/\\&/g' <<< "$REPLACE_TO")

sed -r "s/(.*)$PATTERN.*/\1$REPLACE_TO/" <<< "$STRING"

如果PATTERN不存在则输出为STRING