![使用 sed 替换两个模式之间的字符](https://linux22.com/image/40831/%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E5%AD%97%E7%AC%A6.png)
我想用制表符替换包含给定模式的行之后的所有换行符。
输入文件:
$ cat File1
NAME1
N1_info
NAME2
N2_info
我在未来“选项卡”的末尾创建一些标志:
sed '/^NAME/s/$/\*/g; /^NAME/!{s/^/+/g}' File1.txt > File2.txt
$ cat File2
NAME1*
+N1_info
NAME2*
+N2_info
然后我删除“标志”之间的字符以获得所需的输出。我尝试了两种 sed 模式(但它们都没有改变我的“File2”):
head File2 | sed -e 's/\(\*\).*\(+\)/\1\t\2/g'
head File2 | sed -n '/\*/,/+/p'
输出应该是这样的:
$ cat File3
NAME1 N1_info
NAME2 N2_info
答案1
如果这是您的实际数据,那么
paste - - < File1 > File3
是你所需要的全部。默认情况下,粘贴使用制表符作为分隔符。
如果“N1_info”实际上不止一行,那么这不是您的解决方案。我会做:
perl -0777 -pe 's/\*\n\+/\t/g' File2 > File3
答案2
和sed
:
$ sed '/^NAME/{$!N;s/\n/\t/}' file
NAME1 N1_info
NAME2 N2_info