使用 sed 替换两个模式之间的字符

使用 sed 替换两个模式之间的字符

我想用制表符替换包含给定模式的行之后的所有换行符。

输入文件:

$ 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

相关内容