Comment utiliser des chaînes textuelles dans sed?

6

Par exemple.,

sed 's/string/ /g' where string="a\c:ti]\']x""/\//:`~$%#^&"'

C’est comment passer la chaîne à sed littéralement plutôt qu’en tant que motif de regex interprété?

Je vais utiliser cela avec cygwin et sur Ubuntu. Les solutions doivent donc être compatibles avec l'environnement.

user93200
la source
en relation: stackoverflow.com/questions/407523/…
Ciro Santilli 新疆改造中心 六四事件 法轮功

Réponses:

3

Vous devriez échapper aux caractères spéciaux et utiliser un séparateur autre que "/".

sed 's#string1#string2#'
Scott C Wilson
la source
Je vois le plus souvent | en utilisant sed.
Rob
Certes, c'est une chaîne laide.
Scott C Wilson
1

Voir ce SOq:

Cette réponse à ce qui précède:

est quelque chose dont vous avez besoin, sauf que vous le feriez dans la première partie, pas la deuxième partie de s/first/second/.

Comme vous utilisez les deux ' et " dans vos commandes sed, vous devrez en échapper. Essayez de faire ceci - créez deux fichiers:

1.sed

s_"a\\c:ti]\\']x""/\\//:`~\$%#\^&"'_ _g

2.txt

"a\c:ti]\']x""/\//:`~$%#^&"'hello world m"a\c:ti]\']x""/\//:`~$%#^&"'
"a\c:ti]\']x""/\//:`~$%#^&"'this is working"a\c:ti]\']x""/\//:`~$%#^&"'
"a\c:ti]\']x""/\//:`~$%#^&"'as expected"a\c:ti]\']x""/\//:`~$%#^&"'

1.sed est le script lui-même et 2.txt est un fichier de test. Exécutez-le comme ceci pour tester:

$ sed -f 1.sed 2.txt
 hello world m 
 this is working 
 as expected 

$ 

J'espère que cela t'aides.

icyrock.com
la source
Quelle commande utiliser pour s'échapper? echo "a \ c: ti] \ '] x" "/ \ //:` ~ $% # ^ &' '' | sed -e '/ ([[\ /.*] \ |]) / \ \ & amp; / g 'résulte en un & gt; invite à bash.
user93200
Si vous mélangez les deux ' (devis simple) et " (double citation), vous devrez échapper quelque chose dans la chaîne. Ce n'est pas un "problème" avec sed per-se, même si vous faites juste echo "a \ c: ti] \ '] x" "/ \ //: ~$%#^&"', it will be not a complete string. E.g. you cannot do echo "abc"" and expect it to print abc "` - vous devez échapper à la ".
icyrock.com
Pourriez-vous fournir une commande pour échapper automatiquement à une chaîne donnée et préciser également comment la solution peut être affectée par l'environnement (s'exécutant dans bash ou dans cmd.exe)?
user93200
La commande dans les liens fournis vous donne cela (celui que vous avez mis dans votre premier commentaire à ma réponse). Le problème est que vous ne pouvez pas le faire comme vous le souhaitez - la contribution de echo la commande ne peut même pas arriver à la sed pour être échappé, il doit être échappé sur place pour être même imprimé par echo correctement. L'autre solution - mettre la chaîne dans le fichier - est ce qui fonctionnerait, voir ma modification. J'espère que cela fonctionnera pour vous.
icyrock.com