为什么 awk 不忽略“空格”作为分隔符?

rGA*_*145 6 bash sed awk

我的脚本有问题。

前奏 首先,我有一个列表,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 必须仅将分号解释为分隔符!

我做错了什么?

sch*_*ity 7

如果我理解正确,您可以使用 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)

  • 除非需要保留前导/尾随空格,否则不能只执行“while IFS=”;' 读取 -r id 名称;做`? (2认同)