用多个文件中的字符串和上一行删除行

时间:2018-05-10 00:54:21

标签: sed

我想删除所有包含' n -----'在它们之前和它之前。我已设法在一个文件中执行以下操作:

 sed -i '' -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' FileName.fasta | sed '/^$/d'

但尝试使用多个文件会在某些文件中添加一些内容,例如添加之前没有的行:

 sed -i '' -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' *.fasta | sed '/^$/d'

我猜语法中有问题,因为我使用的是管道,但不确定是什么。我想应该是简单的事情。 非常感谢!

3 个答案:

答案 0 :(得分:1)

对于gnu sed,

sed -s 

将每个文件视为单个单独的文件。

例如,如果您有3个相同的文件a,b和c-no.txt:

cat *-no.t?t
1
2
3

1
2
3

1
2
3

如果没有-s,以下命令将删除文件a中第3行(包含3)的行到下一个文件b以删除第1行,因此对于文件b / c和c从3到文件末尾删除:

sed '/3/,/1/d'  *-no.t?t
1
2
2
2

使用-s,每个文件都被视为单数实体,因此在每个文件中,在文件结束后,不会搜索匹配的第1行:

sed -s '/3/,/1/d'  *-no.t?t
1
2
1
2
1
2

多个选项和参数的语法并不特殊,您可以使用

sed -i -s 
sed -s -i 
sed -is 
sed -si 

并使用更多选项/参数构建更多变体。

答案 1 :(得分:0)

想象一下,您有以下输入文件:

<强> INPUT:

$ more file*.in
::::::::::::::
file2.in
::::::::::::::
u
v
w
n----- to remove
u
v
w
n----- to remove
u
::::::::::::::
file.in
::::::::::::::
a
b
c
n----- to remove
a
b
c
n----- to remove
a

<强>命令:

在测试之前备份您的文件!!!

$ for f in `grep -l "^n-----" *.in`; do echo "processing file: $f"; sed -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' "$f" | sed '/^$/d' > "${f}.out" && mv "${f}.out" "$f"; done
processing file: file2.in
processing file: file.in

<强>说明:

对于包含以^n-----开头的行的所有输入文件,它将运行sed命令,它会将sed的输出重定向到tmp文件并将其移回如果sed命令成功完成,则原始文件(覆盖)。

<强>输出:

$ more file*.in
::::::::::::::
file2.in
::::::::::::::
u
v
u
v
u
::::::::::::::
file.in
::::::::::::::
a
b
a
b
a

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -i 'N;/\nn---/d;P;D' file1 file2 ...

这会在整个文件中创建一个双行窗口,如果第二行开始n---,则会删除这两行。 -i编辑文件,创建临时文件,并在编辑后将其重命名为原始文件。