これがはっきりとわかるように、私はプログラミング(/スクリプト?)が初めてです。
目的:
新しいLinuxインスタンスを自動的にインストール/構成するために再利用可能なスクリプトを作成しようとしています。引き続き問題が発生するためです。この場合は /etc/pam.d/sshd を操作しています。
学習... sedは私に本当に引用、休憩時間、すべての基本について教えてくれました。
ご覧のとおり、正常に動作しましたが、いくつかの問題があります。 (このアプローチがどれほど壊れやすいかを指摘する人がいるかどうかわかりません。)
質問1-2)
変数ファイル- seinsert.shに引数として渡される
sedfind="# Standard Un\*x authentication."
#sedfind=".* Standard Un\*x authentication"
sedinsert="I am a \nmulti line variable \nand I kind of work"
sedfile=sshd
たとえば、sedコマンドに必要なすべての文字をエスケープするか、ここでワイルドカードを使用します。なぜなら、更新時に変数ファイルを一度だけ変更すればよいからです。少なくとも私にとって、これはAです。よりきれいなもの。
また、変更が出力/結果にどのような影響を与えるかを簡単に確認できるため、理解するのに非常に役立ちます。
Q1.ここに引用した内容と新しい行は正しいですか?これはうまくいくようですが、他の方法はありますか?この状況を破るキャラクターにすぐ会うような気がします。はいありますか?
Q2.必要に応じて、ファイルをより使いやすくするために変数を複数行に分割できます(たとえば、行の末尾に\を使用するなど) - sourceとsedがまもなく提供されることに注意してください。
たぶん、スクリプトの他のコマンドはそれを処理できますか? (Grep?または他のsed?。
質問2
seinsert.sh
set -x
source $1
sed -i "\|$sedfind|a\ \n$sedinsert" $sedfile
できるだけきれいに保ち、変数の周りに引用符を使用しないようにしています。現在置き換えるものは他にもありますが、次にコマンドを変数として渡すことを検討してください。
私はこのアイデアに完全に同意するわけではありませんが、その理由がわかります...つまり、@#などの「難しい」文字を含むさまざまなファイルを変更するために使用されます。
Q:それで、コマンド自体に最初の新しい行を入れる必要があります(| a \/ N....).望ましくない場合、または複数の空行を含めたい場合は、変数自体に入れる方法はありますか?
質問3
sedでは、パターン区切り文字(正しい用語?)を\から|に設定できます。私がここにいるように。
しかし、うまくいくファイルが見つかったと思うたびに、私が見ている次のファイルにそのファイルが含まれていることは確信しています。
Q:他の場所ではほとんど使用されていない提案/標準ファジィ区切り記号はありますか?だから#|代わりに、いくつかのロシア語の文字(ロシア人にはお詫び申し上げます)など、ファイルには常に見つかりません。
なぜ誰もが共通を使用するのは少し混乱しています。これは、人々が他の答え(例えば/ファイルパス)であらゆる種類の混乱を経験しているようです。
質問4:今、これらすべてをどうすればいいですか?
pam.sshd の数行を例にしてみましょう。
# PAM configuration for the Secure Shell service
# Standard Un*x authentication.
@include common-auth
# Disallow non-root logins when /etc/nologin exists.
account required pam_nologin.so
長すぎてすみません。全体のプロセスを説明する価値があると思いました。
ベストアンサー1
~からseinsert.shsource
bashを使用していると仮定するコマンドが含まれています。
質問1-2)
Q1.
あなたは正しいです。
Q2.
実際には、改行文字を持つ変数を持つことが可能です。
sedinsert="I am a
multi line variable
and I kind of work"
ただ購入してください変数ファイル有効なbashスクリプトです。
あなたの目的に応じて、次の変数を使用できます(各改行文字の前にバックスラッシュを追加します)。
sedinsert="I am a \
multi line variable \
and I kind of work"
sedで使用する場合はバックスラッシュが必要です。変更せずにコマンドを使用できるようになりました。
sed -i "\|$sedfind|a\ \n$sedinsert" $sedfile
質問2
sed コマンドは、a \
次のように改行文字とともに使用する必要があります。
sed -i "\|$sedfind|a \
$sedinsert" $sedfile
たとえば、次のコマンドは
sed "/ping/a \
pong" -i file.txt
pong
部分文字列「ping」を含む各文字列の後に文字列が追加されます(追加の改行や空白なし)。
形状が気に入らない場合は、$'word'
メカニズムを使用して改行を表すことができます。
sed "/ping/a \"$'\n'"pong" -i file.txt
または
newline=$'\n'
sed "/ping/a \${newline}pong" -i file.txt
質問3
まず、各記号は模様(例sedfind
:)には含まれていません。ファイルの内容は$sedfile
重要ではありません。区切り文字は、パターンの終わりを示すためにのみ使用されます。次に、パターンに区切り文字を使用する必要がある場合は、バックスラッシュを使用してすべての項目をエスケープできます。
sed "\|bar\|bar| a \
foo-foo"
foo-foo
含まれる各文字列の後に文字列を追加します。bar|bar
利用可能ですが、他の場所ではほとんど使用されていない推奨/標準パージ区切り記号はありますか?
私はそれについて何も知りません。
しかし、私のバージョンのsedはロシア語の文字を区切り文字として受け入れません(エラーメッセージdelimiter character is not a single-byte character
)。
一般化する
これでこれを使うことができます変数ファイル:
sedfind="# Standard Un\*x authentication." # all occurrences of symbol '|' must be escaped by backslash as far as '|' is sed pattern delimiter
#sedfind=".* Standard Un\*x authentication"
sedinsert="I am a \
multi line variable \
and I kind of work"
sedfile=sshd
このseinsert.sh:
set -x
source $1
sed -i "\|$sedfind|a \
$sedinsert" $sedfile
変数を二重引用符で囲むことをお勧めします(そうしないと、特殊記号を含むファイル名でスクリプトが中断されます)。
set -x
source "$1"
sed -i "\|$sedfind|a \
$sedinsert" "$sedfile"
このスクリプトは、パターンに一致するファイルの各行の後に文字列を追加します$sedinsert
。$sedfile
$sedfind
人々が役に立つと思うかもしれない引用、正規表現、およびsedスクリプトのための良いチュートリアル:http://www.grymoire.com/Unix/