ファイルの指定された行にコマンドライン情報を挿入します。

ファイルの指定された行にコマンドライン情報を挿入します。

ソースファイル:

$cat test.file 
aaa
bbb
ccc

2行目に挿入したいのですが、echo test> /var/tmp/file必要な結果は次のとおりです。

$ cat test.file 
aaa
echo test > /var/tmp/file
bbb
ccc

以下を試しましたが失敗しました:(

$ sed -i "2 s/^/echo test > /var/tmp/file\n/" test.file                                          
sed: -e expression #1, char 20: unknown option to `s'

$ sed -i "2 s/^/"echo test > /var/tmp/file"\n/" test.file 
-bash: /var/tmp/file\n/: Is a directory

答え1

努力する:

sed '2i echo test > /var/tmp/file' infile

2i2行目にテキストを挿入すると言います。


独自のソリューションも機能するはずですが、テキストに追加/したいものがあり、それ自体が文字を代替文字として使用するため、互いに競合します。sed/

この問題を解決する方法は2つあります。

  1. sed/代替文字を入力ファイルにない他の文字に変更します。

    sed '2 s:^:echo test > /var/tmp/file\n:' infile
    
  2. /ファイルに追加するテキストのすべての文字をエスケープします。

    sed '2 s/^/echo test > \/var\/tmp\/file\n/' infile
    

-i結果がうまくいったら、内部置換用のスイッチをコマンドに追加します。

sed -i '2 s/^/echo test > \/var\/tmp\/file\n/' infile

答え2

これにより、文字をエスケープする必要がなくなります。ファイル読み取りコマンドは、r指定された行番号の後ろ(この場合はIine#1の後ろ)にファイルの内容を配置します。

$ echo 'echo test > /var/tmp/file' \
| sed -i '1r /dev/stdin' file

関連情報