Ich habe ein sehr einfaches Skript geschrieben, das eine Zeichenfolge als Eingabe verwendet und den Eingabetext in einer Datei über sed ersetzt. Aber ich erhalte immer einen Fehler
sed: -e expression #1, char 40: unknown option to `s'
Das Shell-Skript lautet wie folgt
sed -i "s/c9/$1/g" Test.java
und laufen
./code.sh "lmc.driver.findElement(By.xpath(\"//*[@id=\\\"login-email\\\"]\")).clear();\n lmc.driver.findElement(By.xpath(\"//*[@id=\\\"login-email\\\"]\")).sendKeys(username);\n lmc.driver.findElement(By.xpath(\"//*[@id=\\\"login-password\\\"]\")).clear();\n lmc.driver.findElement(By.xpath(\"//*[@id=\\\"login-password\\\"]\")).sendKeys(password);\n lmc.driver.findElement(By.xpath(\"//*[@id=\\\"loginForm\\\"]/div[3]\")).click();\n lmc.driver.findElement(By.xpath(\"//*[@id=\\\"login-identity-domain\\\"]\")).clear();\n lmc.driver.findElement(By.xpath(\"//*[@id=\\\"login-identity-domain\\\"]\")).sendKeys(tenantId);\n
lmc.driver.findElement(By.xpath(\"//*[@id=\\\"loginBtn\\\"]\")).click();"
Antwort1
Die Zeichenfolge enthält unescaped //
. Nach dem Einfügen der Zeichenfolge schließt der erste die Ersetzung, der zweite ist die unbekannte Option.
Sie müssen die Schrägstriche entweder mit Backslashes an sed maskieren (die wiederum an die Shell maskiert werden müssen, daher benötigen Sie doppelte Backslashes, was zu hässlichen Ergebnissen führt) \\/\\/
oder besser ein anderes Trennzeichen für den s
Befehl verwenden, das nicht Teil der Zeichenfolge ist, wie
sed -i "s_c9_$1_g" Test.java
Dadurch verlieren die Schrägstriche ihre besondere Bedeutung.