我在文件中有很多行,我想知道sed是否可以删除列之后的任何内容
例如,改变这个:
a20 is (on) Jan 15
for:
a20 is (on)
答案 0 :(得分:3)
您可以尝试切换:
cut -d " " -f -3 FILENAME
答案 1 :(得分: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
)分隔它们。
答案 2 :(得分:1)
awk
是处理表格数据的工具:
$ awk -v n=4 '{for(i=n;i<=NF;i++)$i=""}1' file.txt
cut
是另一种工具(有时,您需要在tr
之前使用cut
挤压空格:
$ cat file.txt | tr -s ' ' | cut -d ' ' -f 1-3
答案 3 :(得分: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)
答案 4 :(得分:0)
没有人提到perl方式(与sed -i相反,它适用于不使用GNU sed的平台):perl -p -i -e 's/(on).*/(on)/' filename
答案 5 :(得分:-1)
是的,您可以使用sed:
sed 's/^\([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*\).*/\1/' file.txt > newfile.txt
在sed之后添加“-i”开关,并且(在bash中)文件将被就地编辑(即输入和输出相同)。在测试时首先进行备份。
某些版本的sed将允许您使用扩展的正则表达式,这使得语法更友好。使用“-r”开关:
sed -r 's/^([^ ]+ [^ ]+ [^ ]+).*/\1/' file.txt > newfile.txt
[^ ]
表示除空格外的所有字符。
[^ ]*
表示除空格外的任何字符零或更多
[^ ]+
表示除空格外的任何字符中的一个或多个
\1
表示替换为第一个括号表达式
当然,你总是可以使用cut :-):
cut -f-3 -d" " file.txt > newfile.txt