将以空格开头的行追加到上一行

时间:2017-10-19 15:46:16

标签: shell awk sed

我想将我的文件中以空格开头的每行添加到上一行。

INPUT FILE

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc
 =lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad
 ,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=
 rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad
 ,dc=lan

输出文件

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-epot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

提前致谢

8 个答案:

答案 0 :(得分:1)

使用sed

sed ':a;N;$!ba;s/\n //g' file

在多行版本中有更好的解释:

# Define a label called 'a'
:a
# Read the next line of input and append it to the
# internal pattern buffer
N
# $ means 'the last line of input'
# ! negates the match
# ba (b)ranches back to label 'a'
# Means:
# Unless we've reached the end of the input file
# read the file line by line into the pattern buffer 
$!ba
# Once the end of the input file is reached we substitute
# every occurrence of newline+space by an empty string
s/\n //g
# sed will print the result of the substitution by default

PS:根据您的sed版本,您可能需要使用:

s/
 //g

而不是

s/\n //g

意味着如果不支持\n,则需要使用文字换行符

顺便说一下,如果你的输入文件只包含两行,其中一行必须附加到前一行,而只有(!),那么它可以像下面这样简单:

sed 'N;s/\n //' file

这也不需要将整个文件缓冲在内存中。

答案 1 :(得分:1)

使用 awk

的可能解决方案
$ awk -v RS= '{gsub(/\n /,"")}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

$ awk -v OFS= -v ORS= '/^ /{$NF=$NF RS}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan


$ awk -v ORS= '/^ /{ sub(/ /,""); $NF=$NF RS}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

$ awk '/^[^ ]/{ORS=""} /^ /{OFS=""; $1=$1; ORS=RS}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

我会推荐第1,第2和第3个解决方案 第四个是第二个更详细的版本。

还有更多,但我认为这就足够了。

答案 2 :(得分:0)

关注awk可能对你有帮助。

awk '{sub(/^ +/,"");printf("%s%s",$0~/^role/?(NR==1?$0:RS $0):$0,$0)} END{print ""}'   Input_file

答案 3 :(得分:0)

awk救援!

$ awk '{if(sub(/^ /,p,$0)) print; else p=$0}' file

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

答案 4 :(得分:0)

另一种 awk 方法:

awk '{ printf "%s%s",$1,(/^ /? ORS:"") }' file

输出:

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

答案 5 :(得分:0)

perl -0pe 's/\n +//g' input-file

答案 6 :(得分:0)

这可能适合你(GNU sed):

sed ':a;N;s/\n //;ta;P;D' file

在图案空间中读取两行,如果附加的行以空格开头,则删除前面的换行符和空格并重复。否则,打印图案空间中的第一行,删除第一行并重复。

答案 7 :(得分:0)

根据您发布的数据:

$ awk '{ORS=(sub(/^ /,"")?RS:"")}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

使用其他数据YMMV,希望您对样本有所考虑。