regex - bash 替换在匹配换行符时似乎不起作用

标签 regex linux bash

我有一个名为 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/

相关文章:

bash:在 "select"提示中按下回车时,从大小写中选择默认值

javascript - 用 JS 中的正则表达式替换句子

javascript - 用于验证 SSN 或 Tin 的正则表达式代码

javascript - 正则表达式从 xml 中提取图像

c - OpenSSL 和 AES

c++ - 通过 Mmap-ed 共享内存传递可变长度的 C 字符串

bash - 在子 shell 中执行时间

java - REGEX.. 将 X_FOO_BAR 转换为 fooBar

c - 在调用 execl() 之后退出 (0) 是否有意义?

bash - 如何获取管道中进程的PID