多行 sed 替换覆盖以前的输出

多行 sed 替换覆盖以前的输出

我正在尝试对两行进行 sed 替换,如下所示:

sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/}'

我从答案中得到了这个语法这里,这解释了我首先匹配模式的第一行,然后将下一行添加到模式空间以N进行替换。这在以前的场合对我有用,但这次最奇怪的事情发生了。

对于输入:

user-type: admin
password minumim length: 8
user-type: auth
password minumim length: 8

我得到:

 8min
 8th

当我预期的时候:

admin 8
auth 8

看起来第二个保存的匹配是从行的开头打印的,并替换了之前打印的内容。

任何想法?

答案1

你的命令对我有用:

$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/}' file.txt
admin 8
auth 8

但是,如果将输入转换为 DOS 格式,我会得到您看到的输出:

$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/}' <(sed 's/$/\r/' <file.txt)
 8min
 8th

一种解决方案是将输入文件转换为 UNIX 样式的行结尾。

另一个解决方案是调整 sed 命令以容忍\r字符:

$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/; s/\r//}' <(sed 's/$/\r/' <file.txt)
admin 8
auth 8

或者:

$ sed -r '/user-type/{N;s/user-type: ([^\r]*).?\n.*gth: .*([0-9]+).*$/\1 \2/}' <(sed 's/$/\r/' <file.txt)
admin 8
auth 8

相关内容