2012-03-02 121 views
1

我有一大堆文件中的行的,我想知道如果sed的可擦写不管它是列擦除使用sed

例如后,改变这个:

a20 is (on) Jan 15

为:

a20 is (on)

+0

你想这一个后删除所有行?用*文本缩短所有行*或者缩短所有行? – 2012-03-02 18:07:08

回答

3

有多种方法可以做到这一点。如果你想在每一行删除了一切,一个括号后,只需使用:

sed -i 's/).*/)/' file.txt 

什么上面确实是“一个括号后匹配的一切,只是一个括号更换整场比赛。”

这就是说,最简单的工具通常是正确的。 cut提供了一种非常简单的方法,根据您传递给它的delimiter将行“切分”为块。例如:

cut -d" " -f -3 file.txt 

现在,如果你的文件是一个有点不同,第三列不一定有一个括号结束,您可以使用awk代替。 Awk提供了更多的控制,并且比cut更精细。

例如:

awk -F' ' '{ print $1, $2, $3 }' file.txt 

什么上面所做的是分开的每一行,使用具有-F传递作为字段分隔符的字符。然后,它会打印三个第一个字段,并使用相同的字段分隔符(OFS)分隔它们。

+3

'print $ 1,$ 2,$ 3'是相同的,但比'print $ 1 OFS $ 2 OFS $ 3'更优雅, – 2012-03-02 18:00:19

+0

@glennjackman谢谢Glenn,我没有意识到这一点。我会编辑我的答案以反映它。 – teotwaki 2012-03-02 20:53:50

1

awk是工具处理表格数据很好:

$ awk -v n=4 '{for(i=n;i<=NF;i++)$i=""}1' file.txt 

cut是另一个工具(有时候,你需要cut之前tr挤压的空格):

$ cat file.txt | tr -s ' ' | cut -d ' ' -f 1-3 
3

你可以尝试,而不是削减:

cut -d " " -f -3 FILENAME 
-1

是的,你可以使用SED:

sed 's/^\([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*\).*/\1/' file.txt > newfile.txt 

添加“-i”开关后,sed和(在bash),该文件将就地编辑(即输入和输出是一样的)。在测试时首先进行备份。

某些版本的sed将允许您使用扩展的正则表达式,使语法更友好。使用“-r”开关:

sed -r 's/^([^ ]+ [^ ]+ [^ ]+).*/\1/' file.txt > newfile.txt 

[^ ]表示除空格以外的所有字符。 [^ ]*意味着零个或多个任意字符,除了空间 [^ ]+意味着一个或多个任意字符,除了空间 \1意味着第一个括号表达 当然代替,你总是可以使用,而不是削减:-):

cut -f-3 -d" " file.txt > newfile.txt 
+0

这必须是迄今为止我见过的最丑陋的sed代码... o_O – Morlock 2012-03-02 17:56:28

+0

@Glenn - 好。我已更正了代码。我无法测试它。它可能很难看,但它回答了这个问题。我几乎肯定会在我的代码中使用cut。 – groovyspaceman 2012-03-02 18:06:03

0

这可能会为你工作:

echo "a20 is (on) Jan 15" | sed 's/\(\s*\S*\)\{2\}$//' 
a20 is (on) 

向后工作有时是容易,或转发:

echo "a20 is (on) Jan 15" | sed 's/\(\S*\(\s*\S*\)\{2\}\).*/\1/' 
a20 is (on) 
0

没有人提到perl的方式(其相对于sed的-i,在不使用GNU平台工作SED):perl -p -i -e 's/(on).*/(on)/' filename