【问题标题】:Bash remove every occurrence after first in stringBash 删除字符串中第一个之后的所有出现
【发布时间】:2017-09-30 20:05:46
【问题描述】:

我试图在 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之类的命令会更好!

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    问题

    有很多问题

    • 变量不在单引号内求值。 's/$variable//' 将被视为文字字符串,它 not 包含 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")"
    

    纯 Bash 解决方案

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

    【讨论】:

      【解决方案2】:

      如果你想删除“specific_string”之后的所有内容,它也会删除“/”,就像下面的例子一样:

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

      【讨论】:

        【解决方案3】:

        尝试使用简单的 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/
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-19
          • 1970-01-01
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          相关资源
          最近更新 更多