Bash首先在字符串中删除每个匹配项

时间:2017-09-29 16:32:33

标签: bash sed

我正在尝试删除Bash中路径字符串中specific_string之后的所有内容。到目前为止,我尝试使用sed无效。

variable="specific_string"
input_string="/path/to/some/specific_string/specific_string.something/specific_string.something-else"
output=$(sed 's/$variable//' $input_string)

输出应为"/path/to/some/specific_string/"

如果我不必使用sed等命令,那会更好。

3 个答案:

答案 0 :(得分:2)

问题

有很多问题

  • 变量不在单引号内评估。 's/$variable//'将被视为文字字符串,包含specific_string

  • sed可以修改文件或STDIN中的文本,但不能修改通过参数给出的文本。使用sed 's/...//' $input_string/path/to/some/specific_string/.../file会被打开并且会读取其内容,而不是路径本身。

  • s/string//仅删除 string,而不删除之后的字词。

还记得加倍引用你的变量。如果变量包含空格,则cmd $variable是危险的。 cmd "$variable"是安全的。

Sed解决方案

output="$(sed "s/$variable.*/$variable/" <<< "$input_string")"

GNU Grep解决方案

output="$(grep -Po "^.*?$variable" <<< "$input_string")"

Pure Bash Solution

output="${input_string%%$variable*}$variable"

答案 1 :(得分:1)

如果要删除“specific_string”之后的所有内容,它将删除“/”,就像使用以下示例一样:

output=$(echo $input_string|sed "s/${variable}.*$/${variable}/")

答案 2 :(得分:1)

尝试使用简单的sed:

variable="specific_string"
input_string="/path/to/some/specific_string/specific_string.something/specific_string.something-else"
output=$(echo "$input_string" | sed "s/\(.*$variable\/\).*/\1/")

可变输出的输出如下。

echo $output
/path/to/some/specific_string/