如何用空格替换新行 \n 和即将到来的 + 符号

如何用空格替换新行 \n 和即将到来的 + 符号

将新行 \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

使用gawkor 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

相关内容