我想删除所有包含' 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'
我猜语法中有问题,因为我使用的是管道,但不确定是什么。我想应该是简单的事情。 非常感谢!
答案 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
编辑文件,创建临时文件,并在编辑后将其重命名为原始文件。