如何删除第n列之后的所有内容?
来自
My name is Chris dfgwer5hy4w5hwret
Bob is his name 41rgadfg agaojpr ge]f8098
A guy called karl gWE GWEG34YHTJ eeg452 yfg
收件人
My name is Chris
Bob is his name
A guy called karl
更喜欢是否还删除任何尾随空格。
我知道我可以使用类似的方法删除特定的列,但是我想删除第四列之后的所有内容。
sed -i -r 's/\S+//5'
谢谢, 克里斯
答案 0 :(得分:3)
能否请您尝试以下步骤(在GNU awk
中经过测试)。为了原位保存结果,请在以下代码后附加> temp_file && mv temp_file Input_file
。
awk 'NF=4' Input_file
说明: :NF
是awk
的即用型变量,它指示当前行中的字段数(默认情况下,它认为字段分隔符作为空格),因此我根据OP的问题将其值手动设置为4。现在awk
适用于模式/条件和操作的方法,因此此处未提供任何操作,因此默认情况下将打印具有已编辑字段数的当前行。
或者您也可以按照ghoti先生在评论中的提及使用以下内容。
awk '{NF=4;$1=$1}1' Input_file
解决方案2: 现在也添加了sed
解决方案。考虑到您的实际Input_file与所示示例相同。要将输出保存到Input_file本身,请对以下代码使用sed -i
选项。
sed 's/\(.* is [^ ]*\)\(.*\)/\1/' Input_file
解决方案第3条: :如果您的系统在gensub
的GNU中有awk
,那么下面的内容可能会对您有所帮助。
awk '{reg="(.* is [^ ]*).*";print gensub(reg, "\\1", 1, $0)}' Input_file
答案 1 :(得分:2)
任何awk:
$ awk '{sub("([[:space:]]*[^[:space:]]+){"NF-4"}[[:space:]]*$","")}1' file
My name is Chris
Bob is his name
A guy called karl
使用GNU awk,您可以进行awk -i inplace 'script' file
来获得与sed -i
或perl -i
相同的伪就地编辑,并且您可以手动在外部完全手动地完成它们在内部所做的一切仅由command 'script' file > tmp && mv tmp file
命令,例如
cut -d' ' -f1-4 file > tmp && mv tmp file
答案 2 :(得分:0)
如果它在字符串之后而不是在第n列之后,则按照RavinderSingh13的假设:
cat file.txt | sed 's/^\(My name is [a-z]*\).*/\1/'
答案 3 :(得分:0)
如果您喜欢Perl,则可以使用下面的
$ cat chris.txt
My name is Chris dfgwer5hy4w5hwret
Bob is his name 41rgadfg agaojpr ge]f8098
A guy called karl gWE GWEG34YHTJ eeg452 yfg
$ perl -i -lane ' print join " ", @F[0..3] ' chris.txt
$ cat chris.txt
My name is Chris
Bob is his name
A guy called karl
$
答案 4 :(得分:0)
这可能对您有用(GNU sed):
sed -ri 's/\s+\S+//4g' file
删除第四个及更多组空白,再删除非空白,然后将编辑后的文件返回原位。