rat*_*lan 9 bash text-processing newlines
我正在将文件加载到变量中,问题是该文件是在 Windows 中格式化的,我相信,所以我得到了一个^M而不是换行符。
当值在变量中时如何修改它?我知道我可以修改 VI 中的源代码(顺便说一下,我使用的是 OS X),但是我无法修改原始文件,只能读取它,所以我必须^M从变量中删除。
根据我的理解,\n与 不同^M,因此tr命令不起作用。
编辑
这个问题似乎不清楚;所以这是澄清。
我逐行解析文件;每行有 2 个值,由制表符分隔,在每行的末尾,有一个 ^M,它看起来像这样:
value1 value2^M
value3 value4^M
value5 value6^M
value7 value8^M
Run Code Online (Sandbox Code Playgroud)
我的工作流程非常简单明了:txt 文件包含您在上面看到的内容,循环分隔字段并为每一行获取值;当我打印第二个值时,它有 ^M,我想删除它
while IFS=$'\t' read -r -a line
do
Type1="${line[0]}"
Type2="${line[1]}"
done < $TXTFILE
Run Code Online (Sandbox Code Playgroud)
这意味着当我打印 Type1 时它很好,但是 Type2 变量包含 ^M。我确实使用过tr,但没有用,我确实用过sed删除了变量的最后一个字符,但没有用。希望这能澄清我的问题。谢谢
^M是回车符 (CR),可以指定为\rfortr或 in $'…'。\n指定换行符 (LF),即^J. Unix 行尾是 LF,Windows 行分隔符是两个字符的序列 CR-LF,因此在 Unix 系统(例如 Linux 或 macOS)下查看的 Windows 文本文件看起来像是^M在每一行的末尾,除了最后一行缺少最后一个换行符的行。
您可以从一个文件中删除回车tr与
tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt
Run Code Online (Sandbox Code Playgroud)
或更简单地使用dos2unix.
为避免修改文件,您可以在阅读时检查每一行并在行尾去掉 CR。例如,如果您read用于解析制表符分隔的值,则在最后一个字段的末尾去除 CR。参数扩展${VAR%$'\r'}产生VAR减去尾随 CR 的值,VAR如果它不以 CR 结尾,则产生值。
while IFS=$'\t' read -r -a line
do
line[$((${#line[@]}-1))]="${line[$((${#line[@]}-1))]%$'\r'}"
Type1="${line[0]}"
Type2="${line[1]}"
done < "$TXTFILE"
Run Code Online (Sandbox Code Playgroud)
这是修复脚本的最简单方法,只需添加“回车”作为读取命令的内部字段分隔符:
而 IFS=$'\t \r ' 读取 -r -a 行
做
Type1="${line[0]}"
Type2="${line[1]}"
完成 < $TXTFILE
小智 7
使用(对于短字符串):
${var//$'\015'}
Run Code Online (Sandbox Code Playgroud)
例子:
$ var=$'This is a test of a CR (\r) character'
$ echo "${var//$'\r'}"
This is a test of a CR () character
Run Code Online (Sandbox Code Playgroud)
对于较长的字符串,您可能需要 sed 或 awk。