匹配后删除字符串的一部分,但不使用sed删除行

时间:2014-02-14 17:15:28

标签: unix awk sed

我有一个文件a.com为

N-N3-0.0012   -1  5  6  7  L
C-CT-0.002225 -1  5  8  9  H H-3-1
H-H-0.003534  -1  6  3  4  L

我想将a.com修改为

N  -1  5  6  7  L
C  -1  5  8  9  H H-3-1
H  -1  6  3  4  L

基本上,我想删除第一列中第一个“ - ”匹配后的所有内容,但保留所有其他列。

我可以通过将第一列提取到文件中然后使用sed删除匹配后的所有内容来执行此操作“ - ”并将其替换为原始文件中的第一列。但是我想知道是否有一个简单的命令用sed,因为不删除其余的行,但是匹配后的其余部分。

2 个答案:

答案 0 :(得分:3)

像这样?

kent$  awk '{sub(/-.*/,"",$1)}7' a.com
N -1 5 6 7 L
C -1 5 8 9 H H-3-1
H -1 6 3 4 L

sed的:

kent$  sed 's/-\S*//' file
N   -1  5  6  7  L
C -1  5  8  9  H H-3-1
H  -1  6  3  4  L

如果你想保留格式:

kent$  sed 's/-\S*\s*/ /' file
N -1  5  6  7  L
C -1  5  8  9  H H-3-1
H -1  6  3  4  L

答案 1 :(得分:2)

由于其他人已经提供了sed和awk的解决方案,这里是带有纯shell的脚本

#!/usr/bin/env bash

while read -r a b
do
   echo ${a%%-*} $b
done < file