ldapadd
LDAPディレクトリに新しいエントリを追加するために提供されたさまざまなファイルで、いくつかのプレースホルダの置き換えを実行しています。
sed \
-e 's/%%FOO%%/whatever/g' \
-e 's/%%BAR%%/other thing/g \
file1.ldif.template \
file2.ldif.template \
| ldapadd -x -D 'cn=admin,dc=example,dc=com' -W
私が持っている問題は、最後に空行がない場合は、最初のレコードが最後のレコードにリンクされ、ファイル内の他のレコードがfile1.ldif.template
少なくとも1つの改行で区切られなければならないことです。file2
file1
ldif
もちろん、末尾に空白行を追加できますが、file1
他の開発者(または編集者)が末尾の改行を削除すると、後で簡単に失敗する可能性があります。
要約すると。現在(簡体字)sed出力:
dn: cn=record1_file1,dc=example,dc=com
cn: record1_file1
dn: cn=record2_file1,dc=example,dc=com
cn: record2_file1
dn: cn=record1_file2,dc=example,dc=com
cn: record1_file2
dn: cn=record2_file2,dc=example,dc=com
cn: record2_file2
望ましい(単純化された)出力:
dn: cn=record1_file1,dc=example,dc=com
cn: record1_file1
dn: cn=record2_file1,dc=example,dc=com
cn: record2_file1
dn: cn=record1_file2,dc=example,dc=com
cn: record1_file2
dn: cn=record2_file2,dc=example,dc=com
cn: record2_file2
私はGNU sedを使用してLinux(fedora 21)で作業しています。移植性は問題ではありません(ただし、私はGNUソリューションよりも移植可能なソリューションを好む)。
答え1
GNU sed拡張を使用すると、各ファイル名の後に空の改行を追加できます(行アドレスは、すべての入力を'sと変数-s (--separate)
と同様に1つの長いストリームとして処理するのではなく、各ファイル名を参照します)。awk
FNR
NR
sed \
-s \
-e '$a\\' \
-e 's/%%FOO%%/whatever/g' \
-e 's/%%BAR%%/other thing/g \
file1.ldif.template \
file2.ldif.template \
| ldapadd -x -D 'cn=admin,dc=example,dc=com' -W
したがって、-s
withを使用すると、すべての入力ファイルの末尾に改行文字が-e '$a\\'
挿入されます。sed
答え2
簡単で移植可能な方法は、fileパラメータに空白行を含むファイルを挿入することです。
# create file with one empty line
echo > emptyline.txt
# calling sed:
sed -e 's/%%FOO%%/whatever/g' \
-e 's/%%BAR%%/other thing/g \
file1.ldif.template \
emptyline.txt \
file2.ldif.template \
| ...
一部のシェルはこれをサポートしています:
sed -e 's/%%FOO%%/whatever/g' \
-e 's/%%BAR%%/other thing/g \
file1.ldif.template \
<(echo) \
file2.ldif.template \
| ...