从Bash中的行中删除中间的n个字符

时间:2013-08-12 12:02:46

标签: bash unix sed cut

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

79.472850   97 SILENCE 

我最终需要:

79.472850 SILENCE

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

sed "s/\(.\{9\}\).\{6\}//"但我最终得到了字符14之后的所有内容。标签空间后面的数字会在每个文件中发生变化。我怎样才能使sed只切出标签和两位数?

感谢您的帮助。

5 个答案:

答案 0 :(得分:8)

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

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

使用sed

$ sed 's#\([^ ]*\)[ ]*\([^ ]*\)[ ]*\([^ ]*\)#\1 \3#g' <<< "79.472850   97 SILENCE"
79.472850 SILENCE

答案 1 :(得分:4)

您似乎需要输入中的第一个和第三个字段

$ echo "79.472850   97 SILENCE" | awk '{print $1, $3}'
79.472850 SILENCE

答案 2 :(得分:4)

无需拨打sedcut等外部程序,或awk等其他语言, bash 可以为您执行此操作:

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。

答案 3 :(得分:2)

这是一个awk解决方案,即使您的第三列中有空格也能正常工作:

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

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

答案 4 :(得分:1)

如果你想完全像你用sed描述的那样提取:

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

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

kent$  echo "79.472850 97 SILENCE"|awk '$2="";7'
79.472850  SILENCE