Scénario 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}
Scénario 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}
Comme vous pouvez le voir dans le scénario 2, aucun changement dans la sortie, ce qui peut être fait pour remplacer / supprimer des chaînes comme celles-ci en utilisant sed.
Le résultat attendu aurait dû être:
string1=hello_how_are_you string2=hello_ho echo $string1 | sed -e "s/${string2}//g" output : w_are_you
Merci
3 Réponses :
Veuillez essayer ce qui suit:
{},{\"create\":false,\"name\":\"primaryGroup\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"secondaryGroupExistingQueue\",\"queue\":null,\"rules\":null},{\"create\":null,\"name\":\"default\",\"queue\":null,\"rules\":null}
Résultat:
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"
$ rule
doit avoir des séquences d'échappement comme \\\ "
qui est ensuite interprété comme \ "
dans le remplacement de sed
. s / \\ / \\\\\\ / g
remplace la barre oblique inverse unique
avec trois barres obliques inverses séquentielles. Si le travail consiste simplement à vider le premier ensemble d'accolades, il serait plus simple de ne pas utiliser une variable complexe $ {rule}
, et d'effacer simplement ces accolades:
sed 's/{[^}]*}/{}/' <<< $placement_rule
Il suffit d'utiliser un outil comme awk qui comprend les chaînes littérales (contrairement à sed qui ne comprend que les expressions régulières et le texte de remplacement activé pour les références arrière):
$ 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}
.
$ 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}
En relation: Recherchez une sous-chaîne dans une chaîne et déplacez son ordre dans la chaîne principale
Je recommanderais une manière json de traiter de telles chaînes.
Dans le scénario 1, j'utiliserais plutôt
$ {string1 // $ string2}
. Dans le scénario 2, je traiterais JSON comme le texte structuré dont il s'agit et utiliserais les outils appropriés au lieu de le traiter comme une chaîne brute.Et pourquoi tous les guillemets doubles sont-ils échappés?
@chepner c'est comment le texte d'entrée que j'ai