我正在尝试对两行进行 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