擦除使用sed
有多种方法可以做到这一点。如果你想在每一行删除了一切,一个括号后,只需使用:
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
)分隔它们。
'print $ 1,$ 2,$ 3'是相同的,但比'print $ 1 OFS $ 2 OFS $ 3'更优雅, – 2012-03-02 18:00:19
@glennjackman谢谢Glenn,我没有意识到这一点。我会编辑我的答案以反映它。 – teotwaki 2012-03-02 20:53:50
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
你可以尝试,而不是削减:
cut -d " " -f -3 FILENAME
是的,你可以使用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
这必须是迄今为止我见过的最丑陋的sed代码... o_O – Morlock 2012-03-02 17:56:28
@Glenn - 好。我已更正了代码。我无法测试它。它可能很难看,但它回答了这个问题。我几乎肯定会在我的代码中使用cut。 – groovyspaceman 2012-03-02 18:06:03
这可能会为你工作:
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)
没有人提到perl的方式(其相对于sed的-i,在不使用GNU平台工作SED):perl -p -i -e 's/(on).*/(on)/' filename
你想这一个后删除所有行?用*文本缩短所有行*或者缩短所有行? – 2012-03-02 18:07:08