仅使用Linux Shell编辑文件

时间:2014-09-19 04:28:10

标签: linux bash shell editor

我在linux中有以下文件

<?xml version="1.0"?>
<pinboard>
 <backdrop style=""></backdrop>
 <icon x="" y="" label="" args=""></icon>
 <icon x="" y="" label="" args=""></icon>
</pinboard>

我想添加更多像

这样的行
     <icon x="" y="" label="" args=""></icon>

之间的

 <pinboard>
 </pinboard>

最好在最后一次之前

我只想使用linux shell

4 个答案:

答案 0 :(得分:0)

如果我理解你的问题......

使用nano还是vi? vi应该默认使用您的操作系统... nano可以使用你的包管理器轻松安装...我更喜欢nano cuz它更容易使用(与vi中的神秘外观命令相比,但是在某些系统上你需要安装nano二进制文件)

对不起,我不得不在这里发帖,因为我无法添加评论...

答案 1 :(得分:0)

好的,您可以使用流编辑器SED。您可以在</pinboard>之前插入一行,也可以在<pinboard>之后添加一行。两种方法都使用相同的语法:

追加:

sed '/<pinboard>/a <icon x="" y="" label="" args=""></icon>' /path/to/file.xml

要插入:

sed '/<\/pinboard>/i <icon x="" y="" label="" args=""></icon>' /path/to/file.xml

这些输出更改为标准输出。如果您想要内联更改(在文件本身中),请添加-i开关:

sed -i '/<pinboard>/a <icon x="" y="" label="" args=""></icon>' /path/to/file.xml

如果您愿意,可以将此作为bash中的函数用于填充变量:

append()
{
    local file_name="$1"
    local x="$2"
    local y="$3"
    local label="$4"
    local args="$5"
    sed -i '/<pinboard>/a <icon x="$x" y="$y" label="$label" args="$args"></icon>' $file_name
}

append /some/file.xml 5 20 "Good Label" "--some-arg"

答案 2 :(得分:0)

格式良好的XML文件。 awk也可以用来做这件事。类似于以下内容。

cat /some/file.xml | \
awk \
 '{ if ( $0 ~ <\/pinboard> ) {
      print "<icon x="" y="" label="" args=""></icon>"
      print $0 
    } else {
      print $0 
    }
  }
' > newfile.xml

答案 3 :(得分:0)

简短的脚本提供了直接的解决方案:

#!/bin/bash

[ -n "$1" ] || {
    printf "\n Error, insufficient input. usage: %s xml_filename [endtag] [line2add]\n\n" "${0//*\/}"
    exit 1
}

tag="${2:-</pinboard>}"
l2add="${3:-<icon x=\"\" y=\"\" label=\"\" args=\"\"></icon>}"

while read -r line || [ -n "$line" ]; do        # read each line in XML file
    if [ "$line" = "$tag" ]; then               # if line = tag, begin saving lines
        printf "%s\n" "$l2add"                  # print line to add (l2add)
    fi
    printf "%s\n" "$line"                       # print every line
done <"$1"

exit 0

<强>用法:

parsexml.sh xml_filename [endtag] [line2add]

    endtag (default): </pinboard>
    l2add  (default): <icon x="" y="" label="" args=""></icon>

<强>输出:

$ ./parsexml.sh dat/xml.dat
<?xml version="1.0"?>
<pinboard>
<backdrop style=""></backdrop>
<icon x="" y="" label="" args=""></icon>
<icon x="" y="" label="" args=""></icon>
<icon x="" y="" label="" args=""></icon>
</pinboard>