如何在Mac上使用sed删除行的一部分和下一行

时间:2019-03-22 06:16:37

标签: bash sed

我有一个文件,该文件保存了ASCII流的输出,因此全部为文本。我在Mac上使用带有bash语句序列的sed脚本来清理它。我对此深有感触。

在文件中,有一些地方需要删除行的一部分到末尾和下一行。

文件示例部分:

abcdefg000

hijk

应该出来:

abcdefg
hijk

尝试:

sed '/000/{N;d;}' FILE

这确实删除了下一个空白行,但也删除了第一行。我最终得到:

hijk

由于它是Mac,所以我不能使用sed插入换行符(我已经尝试过),但是我已经成功地替换了一个字符,并使用tr将其切换为换行符。想想如果我这样做了,并且由于tr应该接受一个字符串,包括一个特殊字符,那么我应该能够删除sed的两行,并且行得通。

sed 's/000/|/' FILE | tr '|' '\n|' | sed '/|/{N;d;}'

但是,当我这样做时,我只能得到换行符和tr chops。 sed则找不到它,因此不会删除任何行。我得到:

abcdefg


hijk

man tr说它接受字符串,所以不确定为什么不将\n |作为字符串。

我可以用其他语言的脚本重做此操作,但是我现在花了足够长的时间,并仔细研究了其他一些我想使它起作用的问题和答案。我在sedtr上缺少了一些东西,或者有其他简单的方法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

awk应该很好地按照您想要的方式修改文本文件。在以000结尾的行之后有条件地删除单个换行很简单。我们使用临时变量w来控制能够删除空白行的“前几行”。

awk '/000$/ { sub(/000$/,""); w = NR + 1; } 
     NF == 0 && w < NR { next; } 
     { print; }'

如果脚本需要处理000之后出现多个换行符的可能性,这是一种解决方法。 d的解释是我们是否处于空白行的状态。

awk '/000$/ {d=1;sub(/000$/,"");print;next;} 
     NF == 0 && d { next; } 
    { d = 0; print}'

您可以通过将换行符替换为另一个字符然后再换回来来哄骗sed清理换行符。请注意,无论如何至少在OS X上sed都会在流中添加尾随换行符,因此您必须摆脱流@|或流末尾的任何内容。

cat /tmp/data.txt | tr '\n@' '@\n' | sed 's/000@//' | \
    tr '\n@' '@\n' | sed '/^@$/d'

以下是将000之后的多个换行压缩为单个换行的方法。或者是一种方法。

cat /tmp/data.txt | tr '\n@' '@\n' | sed 's/000@*/@/' | \
    tr '\n@' '@\n' | sed '/^@$/d'

答案 1 :(得分:1)

您可以在OSX上使用此sed

sed '/000$/{s///;n;d;}' file

abcdefg000
hijk


foo

bar

原始文件在哪里:

cat file

abcdefg000

hijk


foo

bar