Bash和脚本帮助生成具有可变内容文件 [英] Bash and Script help generating files with variable content

查看:89
本文介绍了Bash和脚本帮助生成具有可变内容文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

扩展这个问题:<一href=\"http://stackoverflow.com/questions/8598741/how-to-create-several-files-from-a-list-in-a-text-file\">How在文本文件中创建从列表中几个文件?

摘要:

 猫file_full_of_files_names | TR'\\ T'的'\\ n \\ n'|同时读取的文件名;做
如果测试-f$文件名;然后
回声跳\\$名\\,它已经存在
其他
   CP -i initial_content$文件名
科幻
DONE

的伟大工程,为我想要什么,但我想扩展它。下面的内容是什么是'initial_content

发现

 &LT;?XML版本=1.0编码=UTF-8&GT?;
&LT;选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android&GT;
&LT;项目机器人:可绘制=@绘制/ com_aac_cachemate_demo_cachemate/&GT; &LT; /选择&GT;

我想更改

  @绘制/XYZ

XYZ从

变量使用内容创建的文件的名称

  initial_content

但与文件名填写了XYZ变量从

  file_full_of_file_names

内容。

任何脚本小子?抨击?感谢您的帮助!


解决方案

使用 AWK 而不是 CP

 猫file_full_of_files_names | TR'\\ T'的'\\ n \\ n'|同时读取的文件名;做
如果测试-f$文件名;然后
回声跳\\$名\\,它已经存在
其他
   awk的-F/-v OFS =/-v NAME =$文件名'/@drawable/{sub(/.*/,name\"\\\"\",$2);print;next}1'&LT ; initial_content&gt;中$文件名科幻
DONE

测试:

  jaypal:〜/温度]猫文件#示例文件
&LT; XML版本=1.0编码=UTF-8&GT?;
&LT;选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android&GT;
&LT;项目机器人:可绘制=@绘制/ com_aac_cachemate_demo_cachemate/&GT; &LT; /选择&GT;[jaypal:〜/温度]回声$#名初始化的变量
名称[jaypal:〜/温度] awk的-F/-v OFS =/-v NAME =$文件名'/@drawable/{sub(/.*/,name\"\\\"\",$2);打印;接下来} 1'文件
&LT; XML版本=1.0编码=UTF-8&GT?;
&LT;选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android&GT;
&LT;项目机器人:可绘制=@绘制/名/&GT; &LT; /选择&GT;
[jaypal:〜/温度]
[jaypal:〜/ Temp文件夹]文件名=jaypal#重新初始化变量[jaypal:〜/温度] awk的-F/-v OFS =/-v NAME =$文件名'/@drawable/{sub(/.*/,name\"\\\"\",$2);打印;接下来} 1'文件
&LT; XML版本=1.0编码=UTF-8&GT?;
&LT;选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android&GT;
&LT;项目机器人:可绘制=@绘制/ jaypal/&GT; &LT; /选择&GT;

Extending this question: How to Create several files from a list in a text file?

Summary:

cat file_full_of_files_names | tr ' \t' '\n\n' | while read filename; do
if test -f "$filename"; then
echo "Skipping \"$filename\", it already exists"
else
   cp -i initial_content "$filename"
fi
done

works great for what I want, but I'd like to extend it. The content below is what is found in 'initial_content'

<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:drawable="@drawable/com_aac_cachemate_demo_cachemate" /> </selector>

I'd like to change the

@drawable/"XYZ"

XYZ variable to the name of the file created using the content from

initial_content

but with the XYZ variable filled in with the filenames from

file_full_of_file_names

content.

Any script kiddies? Bashers? Thanks for any help!

解决方案

Using AWK instead of cp:

cat file_full_of_files_names | tr ' \t' '\n\n' | while read filename; do
if test -f "$filename"; then
echo "Skipping \"$filename\", it already exists"
else
   awk -F"/" -v OFS="/" -v name="$filename" '/@drawable/{sub(/.*/,name"\"",$2);print;next}1' < initial_content > "$filename"

fi
done

Test:

jaypal:~/Temp] cat file # Sample File
<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:drawable="@drawable/com_aac_cachemate_demo_cachemate" /> </selector>

[jaypal:~/Temp] echo $filename # Variable Initialization
name

[jaypal:~/Temp]  awk -F"/" -v OFS="/" -v name="$filename" '/@drawable/{sub(/.*/,name"\"",$2);print;next}1' file
<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:drawable="@drawable/name"/> </selector>
[jaypal:~/Temp] 


[jaypal:~/Temp] filename="jaypal" # Re-initializing variable

[jaypal:~/Temp]  awk -F"/" -v OFS="/" -v name="$filename" '/@drawable/{sub(/.*/,name"\"",$2);print;next}1' file
<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:drawable="@drawable/jaypal"/> </selector>

这篇关于Bash和脚本帮助生成具有可变内容文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆