Bash:在for循环中追加echo $变量后的字符

时间:2018-04-30 07:35:20

标签: bash loops for-loop echo substitution

我尝试解析csv文件并从字段中获取某些值,这有效:

$ for line in $(cat test.csv); do regiovalue="$(echo $line | awk -F';' '{print $4}')"; echo "regio: ${regiovalue}"; done
regio: TOG
regio: APP
regio: APP
regio: APP

但是我需要在echo输出的末尾添加另一个字符:

$ for line in $(cat test.csv); do regiovalue="$(echo $line | awk -F';' '{print $4}')"; echo "regio: ${regiovalue};"; done
;egio: TOG
;egio: APP
;egio: APP
;egio: APP

正如您所看到的那样,在行的开头添加了添加的分号字符,并替换了该行的第一个字符(r)。顺便说一下它是分号还是任何其他字符并不重要。

这只发生在一个循环中(包括for和read测试),一个简单的回声没有问题:

$ regiovalue=TOG; echo "regio: ${regiovalue};"
regio: TOG;

Bash版本:

$ bash --version | grep bash
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
  1. 为什么会这样?我检查了文档,但在循环中找不到任何关于字符替换的特殊内容。
  2. 如何在单个回声中获得输出(变量值和其他字符)?

1 个答案:

答案 0 :(得分:2)

这里的问题是你的行可能以\r结尾...这会导致光标返回到行的开头(回车)。

$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
>     | hexdump -Cv
00000000  68 65 6c 6c 6f 0d 0a 68  6f 77 0d 0a 61 72 65 0d  |hello..how..are.|
00000010  0a 79 6f 75 0d 0a                                 |.you..|
00000016

您应该使用tr

过滤掉它
$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
>     | tr -d $'\r' \
>     | hexdump -Cv
00000000  68 65 6c 6c 6f 0a 68 6f  77 0a 61 72 65 0a 79 6f  |hello.how.are.yo|
00000010  75 0a                                             |u.|
00000012

或设置awk的记录分隔符:

$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
>     | awk -vRS='\r\n' '{print $0}' \
>     | hexdump -Cv
00000000  68 65 6c 6c 6f 0a 68 6f  77 0a 61 72 65 0a 79 6f  |hello.how.are.yo|
00000010  75 0a                                             |u.|
00000012

正如dawg所指出的,你可以使用awk来做所有事情:

awk -vRS='\r\n' -F';' '{print "regio: " $4}' < test.csv