2013-08-12 5 views
4

Я пытаюсь вырезать середину каждой строки в файле. Все линии, как это:Вырезать средние символы из строк в bash

79.472850 97 SILENCE 

и мне нужно закончить с:

79.472850 SILENCE 

Поскольку каждая линия имеет нежелательную часть, начиная с символа десять и заканчивающийся на символ 14, я пытался использовать sed таким образом:

sed "s/\(.\{9\}\).\{6\}//" но я просто получаю все, что нужно после символа 14. Цифры, следующие за полем табуляции, меняются в каждом файле. Что я могу сделать, чтобы заставить sed просто вырезать вкладку и две цифры?

Благодарим за помощь.

ответ

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

Принимается из-за объяснения того, как это работает. Благодаря! – Felixia

4

Похоже, вам нужен первый и третий поля от входа:

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

Или 'awk '{print $ 1, $ 3}' file' для работы с вашим файлом. – svante

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 
3

Нет необходимости вызывать внешние программы, как sed или cut или других языках, как awk , Баш может сделать это для вас:

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

${var:0:9} копии 9 символов, начиная с позиции 0 (начало текста).

${var:14} копии с позиции символа 14 до конца текста.

В качестве альтернативы, если это пространство разделителем поля вам нужно:

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

Опять же, что использует чистый Баш.

2

Вот решение AWK, который работает, даже если у вас есть пробелы в вашей третьей колонке:

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

Где $2="" опустошает второй столбец и print выходы всех колонок.

Смежные вопросы