我的脚本有问题。
前奏 首先,我有一个列表,100 行文件,如下所示:
100;TEST ONE
101;TEST TWO
...
200;TEST HUNDRED
Run Code Online (Sandbox Code Playgroud)
每行有 2 个参数。例如,第一行的参数是:“645”、“TEST ONE”。所以分号是一个分隔符。
我需要将两个参数放在两个变量中。假设它将是 $id 和 $name。对于每一行,$id 和 $name 值将不同。例如,对于第二行 $id = "646" 和 $name = "TEST TWO"。
之后,我需要获取示例文件并将预定义的关键字更改为 $id 和 $name 值。示例文件如下所示:
xxx is yyy
Run Code Online (Sandbox Code Playgroud)
因此,我想要 100 个不同内容的文件。每个文件必须包含每一行的 $id 和 $name 数据。并且它必须以它的 $name 值命名。
有我的脚本:
100;TEST ONE
101;TEST TWO
...
200;TEST HUNDRED
Run Code Online (Sandbox Code Playgroud)
所以,我只是尝试逐行读取我的列表文件。对于每一行,我得到两个变量,然后使用它们替换示例文件中的关键字(xxx 和 yyy),然后保存结果。
但是出了点问题
结果我只有 1 个输出文件。并且调试看起来很糟糕。
这是我的列表文件中只有 2 行的调试窗口。我只有一个输出文件。文件名只是“TEST”,它包含一个字符串:“101 是 TEST”。
需要两个文件:“测试一”、“测试二”,并且必须包含“100 是测试一”和“101 是测试二”。
如您所见,第二个变量中有一个空格(例如“TEST ONE”)。我认为这个问题与空格特殊符号有关,但我不知道为什么。我将 -F awk 参数放在“;”中,因此 awk 必须仅将分号解释为分隔符!
我做错了什么?
如果我理解正确,您可以使用 while 循环和变量扩展
while IFS= read -r line; do
id="${line%;*}"
name="${line#*;}"
cp sample.xml output/input.tmp
sed -i -e "s/xxx/$id/g" output/input.tmp
sed -i -e "s/yyy/$name/g" output/input.tmp
mv output/input.tmp output/"$name".xml
done < file
Run Code Online (Sandbox Code Playgroud)
正如@steeldriver 所提议的,这里有一个(更优雅的)选项:
while IFS=';' read -r id name; do
cp sample.xml output/input.tmp
sed -i -e "s/xxx/$id/g" output/input.tmp
sed -i -e "s/yyy/$name/g" output/input.tmp
mv output/input.tmp output/"$name".xml
done < file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1717 次 |
| 最近记录: |