插入文件内容作为文件的第一行;在bash中(GNU)

插入文件内容作为文件的第一行;在bash中(GNU),bash,sed,kml,Bash,Sed,Kml,具体任务是使用KML文件的头,并将其插入到数百个没有头的分割KML数据文件中 KML标题为多行和特定间距。我发现我可以使用Sed和'r'readfile选项来获取包含头的文件的内容。但是,当我插入带有“1r”的数据时,头被放在从第二行开始的文件中。sed似乎不允许我在之前插入地址“第0行”。插入模式可以工作,但我不能只获取保存在文件中的头格式,需要编写整个头的脚本 #!/bin/bash for i in ./Split/*; do sed -i '1r KML_Header.t

具体任务是使用KML文件的头,并将其插入到数百个没有头的分割KML数据文件中

KML标题为多行和特定间距。我发现我可以使用Sed和'r'readfile选项来获取包含头的文件的内容。但是,当我插入带有“1r”的数据时,头被放在从第二行开始的文件中。sed似乎不允许我在之前插入地址“第0行”。插入模式可以工作,但我不能只获取保存在文件中的头格式,需要编写整个头的脚本

#!/bin/bash
for i in ./Split/*;
        do sed -i '1r KML_Header.txt' $i
done
KML标题如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                 <altitudeMode>clampToGround</altitudeMode>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                 <altitudeMode>clampToGround</altitudeMode>
            <when>2017-11-16T11:47:52Z</when>
            <gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
            <when>2017-11-16T11:47:44Z</when>
            <gx:coord>-97.8216137 30.481513600000003 259</gx:coord>
            <when>2017-11-16T11:45:37Z</when>
            <gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
            <when>2017-11-16T11:44:54Z</when>
            <gx:coord>-97.82162970000002 30.481479699999998 261</gx:coord>
            <when>2017-11-16T11:39:55Z</when>

1.
攀爬地面
标题的最终结果如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                 <altitudeMode>clampToGround</altitudeMode>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                 <altitudeMode>clampToGround</altitudeMode>
            <when>2017-11-16T11:47:52Z</when>
            <gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
            <when>2017-11-16T11:47:44Z</when>
            <gx:coord>-97.8216137 30.481513600000003 259</gx:coord>
            <when>2017-11-16T11:45:37Z</when>
            <gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
            <when>2017-11-16T11:44:54Z</when>
            <gx:coord>-97.82162970000002 30.481479699999998 261</gx:coord>
            <when>2017-11-16T11:39:55Z</when>

1.
攀爬地面
2017-11-16T11:47:52Z
-97.8216659 30.481537499999998 261
2017-11-16T11:47:44Z
-97.8216137 30.481513600000003 259
2017-11-16T11:45:37Z
-97.8216659 30.481537499999998 261
2017-11-16T11:44:54Z
-97.82162970000002 30.481479699999998 261
2017-11-16T11:39:55Z
然而,这是我目前最好的命令:

<when>2017-11-16T11:47:52Z</when>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                 <altitudeMode>clampToGround</altitudeMode>
            <gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
            <when>2017-11-16T11:47:44Z</when>
            <gx:coord>-97.8216137 30.481513600000003 259</gx:coord>
            <when>2017-11-16T11:45:37Z</when>
            <gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
            <when>2017-11-16T11:44:54Z</when>
            <gx:coord>-97.82162970000002 30.481479699999998 261</gx:coord>
            <when>2017-11-16T11:39:55Z</when>
2017-11-16T11:47:52Z
1.
攀爬地面
-97.8216659 30.481537499999998 261
2017-11-16T11:47:44Z
-97.8216137 30.481513600000003 259
2017-11-16T11:45:37Z
-97.8216659 30.481537499999998 261
2017-11-16T11:44:54Z
-97.82162970000002 30.481479699999998 261
2017-11-16T11:39:55Z

我建议试试awk。使用GNU awk:

awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 ./Split/*
工作原理:

  • -i就地

    这会告诉awk在适当的位置更改文件

  • FNR==NR{hdr=hdr“\n”$0;next}

    这告诉awk,当读取第一个文件(头)时,它应该将内容保存在变量
    hdr
    中,跳过其余命令,然后跳转到
    下一行

  • FNR==1{print substr(hdr,2)}

    这说明,当它启动一个新文件时,它应该首先打印标题(减去变量
    hdr
    中不需要的初始换行符)

  • 1

    这是awks用于打印当前行的神秘速记

例子 使用我们的命令就地更改文件:

$ awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 file*
$ cat file1
1
2
3
4
5
6
$ cat file2
1
2
3
44
55
66

帽子提示。

我建议试试awk。使用GNU awk:

awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 ./Split/*
工作原理:

  • -i就地

    这会告诉awk在适当的位置更改文件

  • FNR==NR{hdr=hdr“\n”$0;next}

    这告诉awk,当读取第一个文件(头)时,它应该将内容保存在变量
    hdr
    中,跳过其余命令,然后跳转到
    下一行

  • FNR==1{print substr(hdr,2)}

    这说明,当它启动一个新文件时,它应该首先打印标题(减去变量
    hdr
    中不需要的初始换行符)

  • 1

    这是awks用于打印当前行的神秘速记

例子 使用我们的命令就地更改文件:

$ awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 file*
$ cat file1
1
2
3
4
5
6
$ cat file2
1
2
3
44
55
66

帽子提示。

您可以使用
cat file1 file2>newfile
file1
前置到
file2
。以循环方式执行此操作

for i in Split/*
do
    cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done

您可以使用
cat file1 file2>newfile
file1
前置到
file2
。以循环方式执行此操作

for i in Split/*
do
    cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done

有很多方法可以做到这一点,比如这里:或者有很多方法可以做到这一点,比如这里:或者有一种更好的方法不需要重写头文件。将
inplace=0
放在
header
之前,将
inplace=1
放在后面。有关在GNU awk中inplace如何工作的详细信息,请参阅。@Barmar更好。谢谢谢谢@John1024,我能让这个工作。我也非常感谢对这些片段的详细解释。我一直对学习awk和sed这两种看似无穷无尽的选择感兴趣。不过我更喜欢Barmar提供的更简单的方法。有一种更好的方法不需要重写头文件。将
inplace=0
放在
header
之前,将
inplace=1
放在后面。有关在GNU awk中inplace如何工作的详细信息,请参阅。@Barmar更好。谢谢谢谢@John1024,我能让这个工作。我也非常感谢对这些片段的详细解释。我一直对学习awk和sed这两种看似无穷无尽的选择感兴趣。不过我更喜欢Barmar提供的更简单的方法。感谢@Barmar提供的快速响应和简单解决方案!感谢@barmar的快速响应和简单解决方案!