bash-每三行删除一次\n
如何从每三行中删除换行分隔符。 例如: 输入:bash-每三行删除一次\n,bash,awk,sed,Bash,Awk,Sed,如何从每三行中删除换行分隔符。 例如: 输入: 1 name John 2 family Grady 3 Tel 123456 输出: 1 name John 2 family Grady 3 Tel 123456 假设所有您想要连接到下一个端点的线都是:(您最初的问题): 为此,您可以使用sed,包括: sed ':a;/:$/{N;s/\n//;ba}' a是一个分支标签。检测模式:$(行尾的冒号),如果找到,则N将下一行追加到当前行,使用s/\N/替换命令删除它们之间的换行符,并使
1
name
John
2
family
Grady
3
Tel
123456
输出:
1
name John
2
family Grady
3
Tel 123456
假设所有您想要连接到下一个端点的线都是
:
(您最初的问题):
为此,您可以使用sed
,包括:
sed ':a;/:$/{N;s/\n//;ba}'
a
是一个分支标签。检测模式:$
(行尾的冒号),如果找到,则N
将下一行追加到当前行,使用s/\N/
替换命令删除它们之间的换行符,并使用ba
命令将其分支回标签a
对于编辑后的问题,您只想将每个三行组的第二行和第三行合并,而不考虑内容:
1
name
John
2
family
Grady
3
Tel
123456
使用:
在该命令序列中,n
将输出组中的第一行,并将其替换为第二行。然后,N
将第三行附加到第二行,s/\N/
将它们之间的换行符更改为一个空格,最后输出组合的两行和三行
然后它进入下一组三人,做同样的事情
这两个命令都将为各自的输入生成所需的输出。假设所有这些行都要与下一个端点连接,并使用
:
(您最初的问题):
为此,您可以使用sed
,包括:
sed ':a;/:$/{N;s/\n//;ba}'
a
是一个分支标签。检测模式:$
(行尾的冒号),如果找到,则N
将下一行追加到当前行,使用s/\N/
替换命令删除它们之间的换行符,并使用ba
命令将其分支回标签a
对于编辑后的问题,您只想将每个三行组的第二行和第三行合并,而不考虑内容:
1
name
John
2
family
Grady
3
Tel
123456
使用:
在该命令序列中,n
将输出组中的第一行,并将其替换为第二行。然后,N
将第三行附加到第二行,s/\N/
将它们之间的换行符更改为一个空格,最后输出组合的两行和三行
然后它进入下一组三人,做同样的事情
这两个命令都将为各自的输入生成所需的输出。这可能适用于您(GNU-sed): 要使用空格替换换行符,请执行以下操作:
sed 'n:N;s/\n/ /' file
另一种选择是使用粘贴:
paste -sd'\n \n' file
这可能适用于您(GNU-sed):
要使用空格替换换行符,请执行以下操作:
sed 'n:N;s/\n/ /' file
另一种选择是使用粘贴:
paste -sd'\n \n' file
输出:
1
name John
2
family Grady
3
Tel 123456
1
name John
2
family Grady
3
Tel 123456
输出:
1
name John
2
family Grady
3
Tel 123456
1
name John
2
family Grady
3
Tel 123456
您可以在Perl中执行此操作
$ perl -pe 's/\n/ /g if $. % 3 == 2' file
1
name John
2
family Grady
3
Tel 123456
您可以在Perl中执行此操作
$ perl -pe 's/\n/ /g if $. % 3 == 2' file
1
name John
2
family Grady
3
Tel 123456
另一个解决方案是Bash:
while read line
do
if [[ $line = *: ]]
then
echo -n $line
else
echo $line
fi
done < input.txt
读取行时
做
如果[[$line=*:]]
然后
回声线
其他的
回音$线
fi
完成
另一个解决方案,在Bash中:
while read line
do
if [[ $line = *: ]]
then
echo -n $line
else
echo $line
fi
done < input.txt
读取行时
做
如果[[$line=*:]]
然后
回声线
其他的
回音$线
fi
完成
使用AWK的单向:
awk '{ printf "%s%s", $0, (NR%3==2 ? FS : RS) }' file
使用AWK的一种方法:
awk '{ printf "%s%s", $0, (NR%3==2 ? FS : RS) }' file
Unix方式:
$ paste -sd'\n \n' input
输出:
1
name John
2
family Grady
3
Tel 123456
1
name John
2
family Grady
3
Tel 123456
Unix方式:
$ paste -sd'\n \n' input
输出:
1
name John
2
family Grady
3
Tel 123456
1
name John
2
family Grady
3
Tel 123456
您确定
2
之后的输入样本是一致的吗?另一种解决方案可能是删除\n
后面的所有:
。抱歉!我有点困了:你敢肯定2
之后的输入样本是一致的吗?另一种解决方案可能是删除\n
后面的所有:
。抱歉!我有点困:你能详细说明一下吗;Npart?@AvinashRaj问题是bash-每三行删除一次\N
它并没有说用空格替换\N
。@MandarShinde看到了,请详细说明N;N
part?@AvinashRaj问题是bash-每三行删除一次\N
它并没有说用空格替换\N
。@MandarShinde请看,使用$0”“
,而不是%s',$0
。稍微短一点awk'x=NR%3==2{printf”%s',$0}!x'
@confused00:如果输入字符串包含格式说明符,则会出现问题;i、 e.printf()
将假定它的参数比应该的多。与其使用$0”“
,不如更安全地使用:%s',$0
。稍微短一点awk'x=NR%3==2{printf”%s',$0}!x'
@confused00:如果输入字符串包含格式说明符,则会出现问题;i、 e.printf()
将假定它的参数比它应该的多。如果有四个词,如1某物名称John
,我们打算用它们做同样的事情,我们如何使用n
和n
?@Mandar,你应该问一个不同的问题,因为它会比隐藏在评论中的一个更容易被曝光。如果有四个词,比如1某物名称John
,我们打算用它们做同样的事情,我们怎么能用n
和n
?@Mandar,你应该问一个不同的问题,因为它比隐藏在评论中的问题更容易被曝光。