【问题标题】:Edit Files Only Using Linux Shell [duplicate]仅使用 Linux Shell 编辑文件 [重复]
【发布时间】:2014-09-19 04:28:09
【问题描述】:

我在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

【问题讨论】:

  • 你为什么不试试 XML 解析器?
  • 那是什么,在 shell 中可用
  • 寻找xmlstarlet
  • 不安装外部软件就不能做点什么吗?
  • 了解ed 或者sed

标签: linux bash shell editor


【解决方案1】:

好的,您可以为此使用流编辑器 SED。您可以在&lt;/pinboard&gt; 之前插入一行,也可以在&lt;pinboard&gt; 之后追加一行。两种方法都使用相同的语法:

追加:

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"

【讨论】:

  • 我爱你.. 特别为 -i
【解决方案2】:

如果我正确理解您的问题...

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

抱歉,我不得不在这里发布,因为我无法添加评论...

【讨论】:

  • 我会使用 Nano 或 VI .. 但我自己不是这样做的。我想务实地做到这一点..我想要的只是一个shell函数,它接受我的字符串并将其插入到文件中之前
【解决方案3】:

对于格式良好的 XML 文件。 awk 也可用于执行此操作。类似于以下内容。

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

【讨论】:

    【解决方案4】:

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

    #!/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>
    

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2023-04-03
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多