Linux 关于sed命令的问题?
我试图使用sed删除文本文件中的某些部分,其行如下: 23920E S:1R:2C:14L:5Ch80727911135272-3421685642-3471265587 23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587-31 1306 4692Linux 关于sed命令的问题?,linux,sed,Linux,Sed,我试图使用sed删除文本文件中的某些部分,其行如下: 23920E S:1R:2C:14L:5Ch80727911135272-3421685642-3471265587 23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587-31 1306 4692 我需要删除的部分是每行中的es:1r:2c:14l:5ch80和es:1r:2c:14l:6ch1。数字在整个文件中都会发生变化,但始终在1到100之间。如果始终使用相同的字段,也可以使
我需要删除的部分是每行中的
es:1r:2c:14l:5ch80
和es:1r:2c:14l:6ch1
。数字在整个文件中都会发生变化,但始终在1到100之间。如果始终使用相同的字段,也可以使用cut
:
jed@jed-osx:~$ echo "23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692" | cut -d" " -f1,8-
23920 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 1 4605 1267 4586 11 1331 4587 -31 1306 4692
编辑:对使用的剪切命令的说明:
-d”“
使用空格作为分隔符
-f 1,8-
返回字段1、字段8和8之后的所有字段您也可以使用cut
进行此操作,如果它始终是相同的字段:
jed@jed-osx:~$ echo "23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692" | cut -d" " -f1,8-
23920 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 1 4605 1267 4586 11 1331 4587 -31 1306 4692
编辑:对使用的剪切命令的说明:
-d”“
使用空格作为分隔符
-f 1,8-
返回字段1、字段8和8之后的所有字段
linux-t77m:$ more st.txt
23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692
linux-t77m:$ sed -r "s/E S:.* ch [0-9]+ //g" st.txt
23920 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 4605 1267 4586 11 1331 4587 -31 1306 4692
这是通过正则表达式替换完成的。命令s///g替换与匹配的每行的每一部分
在这种情况下是es:.*ch[0-9]+
,这意味着:
linux-t77m:$ more st.txt
23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692
linux-t77m:$ sed -r "s/E S:.* ch [0-9]+ //g" st.txt
23920 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 4605 1267 4586 11 1331 4587 -31 1306 4692
这是通过正则表达式替换完成的。命令s///g替换与匹配的每行的每一部分
在这种情况下是es:.*ch[0-9]+
,这意味着:
r开关表示我们正在使用一个“扩展”正则表达式,它通常更清晰,因为它们不需要标准sed regexp需要的那么多反斜杠 您需要删除的7个字段总是相同的吗?@Jed:好的,如果答案是肯定的,
awk
可能是一个更好(或至少更优化)的工具。您需要删除的7个字段总是相同的吗?@Jed:好的,如果答案是肯定的,awk
可能更好(或至少更优化)你能解释一下上面sed命令的每一部分是做什么的吗?通过这种方式,我们都可以学习,而不是依赖于像您这样的sed大师来完成每个变化。我必须承认我没有解释我的cut命令是有罪的,所以我编辑并添加了解释,但是sed要复杂得多。@VinkoVrsalovic,请注意,-r
选项是GNU-sed ism,既不是标准的,也不是通用的。一个更好的现代方法是-E
选项,但即使这样也不是通用的。最好的方法是使用BRE,它可以在所有版本的sed中工作。您能解释一下上面的sed命令的每个部分都做了什么吗?通过这种方式,我们都可以学习,而不是依赖于像您这样的sed大师来完成每个变化。我必须承认我没有解释我的cut命令是有罪的,所以我编辑并添加了解释,但是sed要复杂得多。@VinkoVrsalovic,请注意,-r
选项是GNU-sed ism,既不是标准的,也不是通用的。一个更好的现代方法是-E
选项,但即使这样也不是通用的。最好的方法是使用BRE,它将适用于所有版本的sed。