使用sed从具有特殊字符的字符串中删除子字符串

时间:2019-03-13 19:30:19

标签: bash shell sed

方案1:

string1=hello_how_are_you
string2=hello_ho
echo $string1 | sed -e "s/${string2}//g"
output : w_are_you

方案2:

rule='\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null'
placement_rule='{\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}'

echo $placement_rule |  sed -e "s/${rule}//g"

output : {\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}

正如在方案2中看到的那样,输出没有变化,可以使用sed替换/删除类似的字符串。

预期输出应为:

{},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}

谢谢

3 个答案:

答案 0 :(得分:0)

请尝试以下操作:

rule='\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null'
rule="$(echo "$rule" | sed -e 's/\\/\\\\\\/g')"    # This line escapes the backslashes
placement_rule='{\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}'

echo $placement_rule |  sed -e "s/${rule}//g"

输出:

{},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}
  • 变量$rule的转义序列必须为\\\" 然后在\"替换中将其解释为sed
  • 添加的转换s/\\/\\\\\\/g替换了单个反斜杠 带有三个连续的反斜杠。

答案 1 :(得分:0)

如果工作只是清空第一组花括号,则不使用复杂的${rule}变量,而清除这些花括号会更简单:

sed 's/{[^}]*}/{}/' <<< $placement_rule

答案 2 :(得分:0)

只需使用awk之类的工具即可理解文字字符串(与sed不同,它只能理解regexp和启用了反向引用的替换文本):

$ rule='\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null'

$ placement_rule='{\"create\":false,\"name\":\"specified\",\"queue\":null,\"rules\":null},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}'

$ echo "$placement_rule" | rule="$rule" awk 'BEGIN{rule=ENVIRON["rule"]; n=length(rule)} s=index($0,rule){$0=substr($0,1,s-1) substr($0,s+n)} 1'
{},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}

或:

$ echo "$placement_rule" | awk 'BEGIN{rule=ARGV[1]; ARGV[1]=""; n=length(rule)} s=index($0,rule){$0=substr($0,1,s-1) substr($0,s+n)} 1' "$rule"
{},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}

有关我为什么使用ENVIRON or ARGV [1] to pass the shell variables value in rather than-v`的信息,请参见http://cfajohnson.com/shell/cus-faq-2.html#Q24,即反斜杠只是我使用它的方式。