4

我正在尝试删除文件中每一行的中间部分。所有的行都是这样的:

79.472850   97 SILENCE 

我需要结束:

79.472850 SILENCE

由于每一行都有从字符 10 开始到字符 14 结束的不需要的部分,我试图以这种方式使用 sed:

sed "s/\(.\{9\}\).\{6\}//"但我只是在字符 14 之后得到所有内容。每个文件中制表符空间后面的数字都会发生变化。我该怎么做才能让 sed 只剪掉制表符和两位数?

谢谢你的帮助。

4

5 回答 5

8

根据您的输入和预期输出,这可以是一种方式:

$ echo "79.472850   97 SILENCE" | tr -s " " | cut -d" " -f1,3
79.472850 SILENCE
  • tr -s " "删除重复的空格。
  • cut -d" " -f1,3根据空格分割打印第一个和第三个字段。

sed

$ sed 's#\([^ ]*\)[ ]*\([^ ]*\)[ ]*\([^ ]*\)#\1 \3#g' <<< "79.472850   97 SILENCE"
79.472850 SILENCE
于 2013-08-12T12:06:02.193 回答
4

看起来您需要输入中的第一个和第三个字段

$ echo "79.472850   97 SILENCE" | awk '{print $1, $3}'
79.472850 SILENCE
于 2013-08-12T12:07:59.917 回答
4

无需调用外部程序sedcut,或其他语言awkbash可以为您完成:

var="79.472850   97 SILENCE"
echo ${var:0:9}${var:14}
79.472850 SILENCE

${var:0:9}从位置 0(文本开头)开始复制 9 个字符。

${var:14}从字符位置 14 复制到文本末尾。

或者,如果它是空格分隔的字段,您需要:

read one two three <<< "$var"
echo "$one $three"
79.472850 SILENCE

同样,它使用纯 bash。

于 2013-08-12T12:25:54.447 回答
2

这是一个 awk 解决方案,即使您的第三列中有空格也可以使用:

awk '{$2=""; print}' file

Where$2=""清空第二列并 print输出所有列。

于 2013-08-12T12:27:54.803 回答
1

如果您想完全按照您使用 sed 描述的内容进行提取:

kent$  echo "79.472850 97 SILENCE"|sed -r 's/(^.{9})(.{4})(.*)/\1 \3/'
79.472850 SILENCE

如果要从空格分隔的输入中提取第一列和第三列/最后一列,可以使用 awk:awk '$2="";7'

kent$  echo "79.472850 97 SILENCE"|awk '$2="";7'
79.472850  SILENCE
于 2013-08-12T12:13:25.220 回答