コマンドラインから入力すると Sed がエラーを出す

コマンドラインから入力すると Sed がエラーを出す

文字列を入力として受け取り、sedを介してファイル内の入力テキストを置き換える非常に簡単なスクリプトを作成しました。しかし、常にエラーが発生します。

sed: -e expression #1, char 40: unknown option to `s'

シェルスクリプトは以下のとおりです

sed -i "s/c9/$1/g" Test.java 

そして走る

./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();"

答え1

文字列にはエスケープされていない が含まれています//。文字列を挿入すると、最初の文字列で置換が終了し、2 番目の文字列は不明なオプションになります。

sed ではスラッシュをバックスラッシュでエスケープする必要があります (シェルにエスケープする必要があるため、二重のバックスラッシュが必要になり、結果として見苦しくなります)。または、次のように文字列の一部ではないコマンド\\/\\/に別の区切り文字を使用する方がよいでしょう。s

sed -i "s_c9_$1_g" Test.java

こうするとスラッシュの特別な意味が失われます。

関連情報