【问题标题】:Delete part of a string after a match, but not the line using sed匹配后删除部分字符串,但不使用 sed 删除该行
【发布时间】:2014-02-14 17:15:28
【问题描述】:

我有一个 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 是否有一个简单的命令,用于不删除该行的其余部分,而是在匹配后删除该列的其余部分。

【问题讨论】:

  • 每行数据之间真的有空行吗?
  • 不,没有黑线。谢谢

标签: unix awk sed


【解决方案1】:

喜欢这样吗?

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

【讨论】:

  • 我有类似的问题,除了我的分隔符是“。”但不知何故,我认为它需要一个转义序列,我该如何处理?
【解决方案2】:

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

#!/usr/bin/env bash

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

【讨论】:

    最近更新 更多