传递多个文件名时在 sed 输出中打印空行

传递多个文件名时在 sed 输出中打印空行

我正在提供的各种文件中进行一些占位符替换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'sFNRNR变量)

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

因此,使用-swith-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 \ 
    | ...

相关内容