ed
を使用して、ファイル#
の10行目から20行目の先頭に文字/etc/passwd
を配置します。解決策は次のとおりです
ed /etc/passwd <<\END
10,20s/^/#/
%p
Q
END
私の質問は、ここで<<
が何を意味し、END
の前に\
が何を意味するのか、そしてなぜそれを使用するのかということです。いつも使う必要がありますか?
表示しているのは、編集スクリプトと一緒に使用されているed
です。
編集スクリプト(一連のed
コマンド)は、ヒアドキュメントとしてed
に渡されています。ヒアドキュメントは、ユーティリティの標準入力への、場合によっては複数行のテキストの一部ですリダイレクト。ヒアドキュメントは、最初と最後のEND
マーカーの間にあるものです。最初のEND
マーカーの前にある\
は、ドキュメントが引用されていることを意味します。つまり、シェルはその中の変数などを展開しようとしません。 <<'END'
と書くこともできます。この特定の例では、編集スクリプトにはシェルが展開するものが含まれていないため、\
を削除できます。
これは、より単純な非対話型編集のためにed
を使用する一般的な方法ですが、この方法で使用する場合はed
を-s
オプションとともに使用する必要があります。
このコマンドは、実際にはsed
を使用するのと同じです。
sed '10,20/^/#/' /etc/passwd
(ed
スクリプトはファイルに変更を加え、終了する前にターミナルにファイルを表示しますなし変更を保存します。これは多かれ少なかれ上記のsed
スクリプトは行ごとに実行されます)。
これはnot/etc/passwd
ファイルを編集する良い方法です(ただし、ed
スクリプトは変更を保存しないため、実際には実行していません)。そのためには、vipw
のようなツール、またはこのファイルを変更するために作成された特定のコマンド(useradd
など)を使用する必要があります。これは、多くのUnixシステムでは、ファイルを1つまたは複数の他のファイルまたはデータベースと同期する必要があり、ファイルを編集するにはこれらも更新する必要があるためです(たとえば、vipw
は自動的に行います)。
それはed
ではなく、あなたのシェルです。
これは、Word END
まで生の入力を受け取り、それをコマンドのSTDIN
に送信することを意味します。
例えば:
$ cat <<\END
> something
> END
something
次と同じ結果が生成されます。
$ echo something | cat
something