Bash 如何从多个文件中删除特定字符串之前的所有行
我有n个文件,如: 文件1:Bash 如何从多个文件中删除特定字符串之前的所有行,bash,shell,sed,Bash,Shell,Sed,我有n个文件,如: 文件1: 1aaa 2eee Test XXX Hanna Lars 文件2: 1fff 2ddd 3zzz Test XXX Mike Charly 我想从所有n个文件中删除“Test XXX”之前的所有行。 要删除的行数因文件而异 我的想法是: for file in 1 :n do pos=grep -n "Test XXX" file$file sed -i "1:$pos-1 d" file$file >new$file
1aaa
2eee
Test XXX
Hanna
Lars
文件2:
1fff
2ddd
3zzz
Test XXX
Mike
Charly
我想从所有n个文件中删除“Test XXX”之前的所有行。
要删除的行数因文件而异
我的想法是:
for file in 1 :n
do
pos=grep -n "Test XXX" file$file
sed -i "1:$pos-1 d" file$file >new$file
done
您可以使用
bash
(例如对于1个文件)
t=0
而read-r行
做
[$line=~Test.*XXX]&&t=“1”
大写“$t”
1) 回音“$line”;;
以撒
完成tempo&&mv节奏文件
根据需要使用
for
循环浏览所有文件这应该适用于您:
sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2
或者干脆
sed -i '1,/Test XXX/d' file*
这将适用于您的示例,即使匹配的模式位于第一行:
sed -n -E -e '/Text XXX/,$ p' input.txt | sed '1 d'
例如,如果您的输入是简单的
Test XXX
Mike
Charly
这会给你
Mike
Charly
如果要保留第一个匹配项测试XXX
,只需使用:
sed -n -E -e '/Text XXX/,$ p' input.txt
说明:
复制匹配的行-e'/Test*XXX/p'
/Test*XXX/
从第0行删除到匹配的第一行-e'0,/Test*XXX/d'
/Test*XXX/
注意:如果有多个
Test XXX
行,这将无法像预期的那样工作。问题是什么?似乎是重复的。小心这样做,您将丢失原始文件。这正是-i(内联)选项的目的。如果要同时创建备份文件,只需使用-i.bak
。sed'1,/测试XXX/d'/*未记录,与BSD sed兼容。*/case“E”:case“r”:if(扩展的正则表达式标志)用法(4);extended_regexp_flags=REG_extended;break;…
该链接有时是可以的,因此我将在这里发布它的url:From the manual(man sed
):-E,-r,--regexp extended
;在脚本中使用扩展正则表达式(为了便于移植,请使用POSIX-E).
还有
sed -n -E -e '/Text XXX/,$ p' input.txt
cat <<-EOF > file1.txt
1aaa
2eee
Test XXX
Hanna
Lars
EOF
cat file1.txt | sed -e '/Test *XXX/p' -e '0,/Test *XXX/d'
Test XXX
Hanna
Lars