我有一个文件,该文件保存了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 |
作为字符串。
我可以用其他语言的脚本重做此操作,但是我现在花了足够长的时间,并仔细研究了其他一些我想使它起作用的问题和答案。我在sed
或tr
上缺少了一些东西,或者有其他简单的方法可以做到这一点。
答案 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