我正在提供的各种文件中进行一些占位符替换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
,则 中的第一条记录file2
将连接到 中的最后一条记录file1
,并且在ldif
文件中,不同的记录应至少用 1 个换行符分隔。
当然,我可以在 的末尾添加一个空行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 (--separate)
扩展,您可以在每个文件名后附加一个空换行符(行地址引用每个文件名,而不是将所有输入视为一个较长的流,类似于awk
'sFNR
和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
一种简单且可移植的方法是插入一个文件参数中包含空行的文件:
# 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 \
| ...
有些 shell 也支持这个:
sed -e 's/%%FOO%%/whatever/g' \
-e 's/%%BAR%%/other thing/g \
file1.ldif.template \
<(echo) \
file2.ldif.template \
| ...