方案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}
谢谢
答案 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,即反斜杠只是我使用它的方式。