我有一个名为 test.script
的可执行文件,其中包含这个简单的 bash 脚本:
#!/bin/bash
temp=${1//$'\n'/}
output=${temp//$'\r'/}
printf "$output" > output.txt
当我运行时
sudo ./test.script "^\r\r\n\n\r\n\r\n\r\n\r\n\n\r\n\rHello World\n\n\r\r\r\n\n\r\r\r$"
在与 test.script 相同的目录中,我希望最终得到如下所示的 output.txt:
^Hello World$
但是当我看的时候我却看到了这个:
^
Hello World
$
显然我对 bash 中的正则表达式有误解。
请向我解释我遗漏了什么,然后告诉我如何编写 bash,以便在将所述字符串写入文件之前从字符串中删除所有换行符。提前致谢。
最佳答案
您可以像这样“修复”您的脚本(尽管我必须说这不是 printf
的典型用法):
#!/bin/bash
temp=${1//'\n'/}
output=${temp//'\r'/}
printf "$output"
脚本 $1
的参数不包含真正的换行符或回车符,这是 $'\n'
和 $'\r'
是为了。相反,您似乎只想删除文字字符串 '\n'
和 '\r'
。
为了详细说明我关于 printf
的观点,通常会传递两个(或更多)参数:格式说明符和要插入的变量。例如,要打印单个字符串,您可以使用类似 printf '%s' "$output"
的内容。在您的脚本中,变量 $output
被视为格式说明符;您依靠 printf
将您的 \n
和 \r
扩展为换行符和回车符。
顺便说一下,您实际上并没有在这里使用正则表达式;语法 ${var//match/replace}
是子字符串替换,其中 //
表示子字符串 match
在 $var
被替换。由于您没有指定任何内容来替换子字符串,子字符串将被替换为任何内容(即删除)。
关于regex - bash 替换在匹配换行符时似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31916096/