变量中的dos2unix

4
我需要在一个变量中执行dos2unix命令。 对于文件,我们只需要执行dos2unix myfile.txt。 如何在变量中实现呢? 例如:
variable="bla\r"
dos2unix $variable

欢迎提出使用其他命令的建议。

附注:我无法对我读取文本的文件执行dos2unix操作。


2
顺便提一下,variable="bla\r"将两个字符放入变量中,一个反斜杠和一个r,而不是单个回车符。如果您的shell是bash,则正确的赋值方式之一是variable=bla$'\r' - Charles Duffy
你可以在 trprintf 或者(GNU 的非 POSIX 兼容)echo -e 中使用 '\r'"\r",因为它会自己进行反斜杠解释,而不是期望将字符作为字面输入使用。 - Charles Duffy
3个回答

3

这里不需要任何外部命令;您可以使用参数扩展来仅使用shell本身内置的功能来删除CR,因此在执行速度(对于相当短的字符串)更快,并且保证在任何安装有Bash(或类似扩展Shell,如KSH93或ZSH)的系统上都可以正常工作,即使没有安装dos2unix:

$ PS1='> ' # for readability, to distinguish output starting with '$' literals
> variable_in=$'bla\r'
> variable_out=${variable_in//$'\r'/}
> printf '%q\n' "$variable_in"
$'bla\r'
> printf '%q\n' "$variable_out"
bla

3

dos2unix 可以从标准输入读取数据,因此您可以使用 echo "$variable" | dos2unix 命令。请尝试以下内容:

$ variable=$'bla\r'

$ echo "$variable" | cat -A
bla^M$

$ echo "$variable" | dos2unix | cat -A
bla$

可以说,如果我们遵循 POSIX echo 规范,那么 echo "$variable" 的输出是由标准定义不清的--在该内容中的任何反斜杠转义序列都会使输出未定义(而带有 XSI 扩展的 echo 会默认扩展它们)。如果你想寻找一些乐趣,请参阅 http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html,并且考虑使用 printf '%s\n' "$variable" 来传递未修改的内容(除了添加尾随换行符,或者只是 '%s' 如果不需要尾随换行符的话,这点很重要)。 - Charles Duffy
@CharlesDuffy 但是当我们写 $'blah\r' 时,反斜杠转义序列不是已经被转换成相应的控制字符了吗?echo 命令不应该看到任何反斜杠。 - user000001
当然 - 我不是在谈论这个特定的测试数据; 我们正在构建的东西应该是可重用的,可以使用任意内容,这些内容可能包括反斜杠文字。 - Charles Duffy

2
您可以使用 tr
echo "$variable"| tr -d '\r'

或者
tr -d '\r' <<< "$variable"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接