用sed擦除

时间:2012-03-02 17:23:54

标签: bash sed

我在文件中有很多行,我想知道sed是否可以删除列之后的任何内容

例如,改变这个:

a20 is (on) Jan 15

for:

a20 is (on)

6 个答案:

答案 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