将新行 \n 和即将出现的 + 符号替换为空格
输入文件
ABC
+ DEF
foo
+ bar
输出应该是
ABC DEF
foo bar
答案1
如果文件仅包含交替模式,其中+
每隔一行以 a 开头的行,如
ABC
+ DEF
foo1
+ bar1
foo2
+ bar2
然后使用
$ sed 'N;s/\n+ */ /' file
ABC DEF
foo1 bar1
foo2 bar2
这只是读取一行并附加下一行(使用N
)。然后,它将插入的换行符N
、加号及其后面的空格替换为单个空格。
假设该文件可能如下所示,没有空行(空行将被视为不带 的行+
)。第一行可能不是以加号开头,但最后一行是假定以加号开头。
ABC
+ DEF
foo1
+ bar1
+ baz1
foo2
+ bar2
然后以下sed
脚本会将其转换为
ABC DEF
foo1 bar1 baz1
foo2 bar2
剧本:
# This is the first line
1 {
h; # Save the line in the hold space.
d; # Delete and start next cycle.
}
# This line starts with a plus sign and at least one space.
/^+ */ {
s///; # Delete the plus sign and the space(s).
H; # Append to hold space with embedded newline.
$ !d; # Delete and start next cycle (except for on the last line).
}
# This line of input starts a new set of lines.
# Output accumulated line.
x; # Swap with hold space.
y/\n/ /; # Replace all embedded newlines with spaces
# (implicit print)
你可以用它作为
sed -f script.sed file
作为“一行”:
sed -e '1{h;d;}' -e '/^+ */{s///;H;$!d;}' -e 'x;y/\n/ /' file
答案2
使用 Perl,您可以将整个文件放入,并<newline><plus><space>
直接替换序列:
$ cat foo.txt
ABC
+ DEF
foo1
+ bar1
+ baz1
foo2
+ bar2
$ perl -0777 -pe 's/\n\+ ?/ /g' < foo.txt
ABC DEF
foo1 bar1 baz1
foo2 bar2
(上面的正则表达式删除了加号后面的一个可选空格)
答案3
使用gawk
or mawk
,它支持使用字符串或正则表达式 for RS
,一切都变得简单得多:
$ awk -vRS='\n[+]' -vORS= 1
或者如果你希望它跳过多个空行,如OP的示例所示:
$ awk -vRS='\n+[+]' -vORS= 1 OPs_file
ABC DEF
foo bar
这不会在内存中加载多于一行,并且不会关心第一行是否以+
.
答案4
我已经通过下面的命令完成了尝试不使用上面提到的任何命令
方法一
sed '/^$/d' filename|sed "s/[^A-Za-z]//g"|perl -pne "s/\n/ /g"| awk '{print $1,$2"\n"$3,$4}'
output
ABC DEF
foo bar
第二种方法
step1:
p=`cat y.txt| sed '/^$/d'| sed "s/[^A-Za-z]//g"| awk '{print NR}'| sort -rn| sed -n '1p'`
step2:
for ((i=1;i<=$p;i++)); do cat y.txt| sed '/^$/d'|sed -n ''$i'{p;n;p}'| sed "N;s/\n/ /g";i=$(($i+1)); done| sed "s/[^a-zA-Z]/ /g"
output
ABC DEF
foo bar