sedは\ tをタブに解析しません。

sedは\ tをタブに解析しません。

sedを使用してコーヒースクリプトに行を挿入しようとしていますが、最初のタブ文字を無視しているようです。

挿入するファイルには次の行があります。

    karmaServer.start

次のように行の後に行を挿入したいと思います。

    karmaServer.start
        flags: ['--no-sandbox']

だから私はうまくいくべきだと思うsedスクリプトを書いた。

sed "/^\t\tkarmaServer.start/a\t\t\t\tflags: ['--no-sandbox']" build/unit-test.coffee 

ところで結果が変です。私は次のようになります

    karmaServer.start
t       flags: ['--no-sandbox']

tなぜ文字で行を始めるのか、文字を削除する方法を理解できません。

どんなアイデアがありますか?

答え1

コマンドに改行を追加する必要がありますsed(その後、エスケープされた改行に対するシェルの処理を検討する必要があります)。

 sed "/^\t\tkarmaServer.start/a\\
 \t\t\t\tflags: ['--no-sandbox']" build/unit-test.coffee 

GNUsedマニュアルによると:

ㅏ\

テキスト埋め込み各改行の前にバックスラッシュが続くテキストを追加します。

これは非常に明確ではなく、このようにフォーマットされていません。 (ああ、コマンドで見ると特に明確ではありませんman。)コマンドの形式がaバックスラッシュ、改行文字、そして次のもので構成されていることがわかります。テキスト。つまり、左の列のすべての内容です。

質問コメントで指摘したように、sedsは間違ったコマンドを処理する方法が異なります。 Spinellisは、sed必須のバックスラッシュと改行以外に何かがあることを知らせるエラーを生成します。

% sed "/^\t\tkarmaServer.start/a\t\t\t\tflags: ['--no-sandbox']" /dev/null
sed: 1: "/^\t\tkarmaServer.start ...": コマンドの最後の \ の後に追加文字
%

あなたの特別な選択は、残りの行をsed次のように扱うようです。テキスト議論。ただし、最初のバックスラッシュはまだ次の必須バックスラッシュと見なされますa。だからあなたが終わるのはテキスト主張は

t\t\t\tflags: ['--サンドボックスなし']

最初は、t予想よりもタブが1つ少なくなります。

関連情報