shell 使用sed一次编辑多个xml文件名和内容

62o28rlo  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(135)

我试图写一个bash脚本来改变一个xml文件名和内容在这个XML文件超过500个不同的文件夹。
我更喜欢使用bash脚本的sed命令来执行此过程,而不是使用xmlstarlet,因为我不想在此VM上安装它。这个目录有点烦人,因为xml文件和以前的目录同名。
下面是要修改的文件的示例:

/var/opt/FTPserver/users/MainUsers/junk/VFS/junk.xml
                                   ^^^^     ^^^^

junk.xml包含一行:

<url>file://home/FTPserver/Customer/junk/</url>
                                    ^^^^

我想将文件重命名为以下内容:

/var/opt/FTPserver/users/MainUsers/junk/VFS/treasure.xml
                                   ^^^^     ^^^^^^^^

junk.xml包含修改后的行:

<url>file://home/FTPserver/Customer/treasure/</url>
                                    ^^^^^^^^

customerlogin.csv是逗号分隔的,列A = junk,列B = treasure作为我的测试示例。

while IFS=, read -r orig new; do
find "/var/opt/FTPserver/users/MainUsers/"$orig"/VFS/" -name "$orig" -execdir mv -n -- {} "$new" \;
sed -i 's#/"$org"#$new"#' "$new".xml
done < customerlogin.csv

我对bash和脚本是新手。我希望我不能像上面那样引用.xml文件,并且当我运行脚本时什么也没有发生。

nafvub8i

nafvub8i1#

至少可以把这个作为一个起点:

dir='/var/opt/FTPserver/users/MainUsers/'
while IFS=, read -r oldStr newStr; do

    oldFile="$dir/$oldStr/VFS/${oldStr}.xml"
    newFile="$dir/$oldStr/VFS/${newStr}.xml"

    if [[ -f "$oldFile" ]] && [[ ! -f "$newFile" ]]; then
        sed "s:/$oldStr/:/$newStr/:" "$oldFile" > "$newFile" &&
        rm -f "$oldFile"
    fi

done < customerlogin.csv

这假设你的oldStrnewStr字符串不包含regexp元字符或反向引用元字符,参见Is it possible to escape regex metacharacters reliably with sed,并且oldStr只出现在你想要在文件中修改它的位置。

相关问题