Добавить в конце строки с помощью sed

задан простой текстовый документ с несколькими строками, например:

c48 7.587 7.39
c49 7.508 7.345983
c50 5.8 7.543
c51 8.37454546 7.34

Мне нужно добавить информацию через 2 пробела после конца строки, поэтому для каждой строки я получаю:

c48 7.587 7.39  def
c49 7.508 7.345983  def
c50 5.8 7.543  def
c51 8.37454546 7.34  def

Мне нужно сделать это для тысяч файлов. Я думаю, это можно сделать с помощью sed, но не знаю, как это сделать. Любой намек? Не могли бы вы также дать мне ссылку на учебник или таблицу для этих случаев?

Спасибо


person Open the way    schedule 25.03.2010    source источник


Ответы (2)


если все ваши файлы находятся в одном каталоге

sed -i.bak 's/$/  def/' *.txt

сделать это рекурсивно (найти GNU)

find /path -type f -iname '*.txt' -exec sed -i.bak 's/$/  def/' "{}" +;

вы можете увидеть здесь для ознакомления с sed

Другие способы, которые вы можете использовать,

аук

for file in *
do
  awk '{print $0" def"}' $file >temp
  mv temp "$file"
done 

Баш-оболочка

for file in *
do
  while read -r line
  do
      echo "$line def"
  done < $file >temp
  mv temp $file
done
person ghostdog74    schedule 25.03.2010
comment
Что такое +;? Я всегда использую \;. Справочная страница bash не делает меня мудрее. - person Thomas; 25.03.2010
comment
это есть на справочной странице GNU find's. его эквивалент xargs - person ghostdog74; 25.03.2010
comment
привет, awk один хорош. просто короткий вопрос, как можно применить awk '{print $0 def}' $file ›temp к конкретному номеру строки файла? - person Open the way; 25.03.2010
comment
@werner, для номера строки, также известного как номер записи, используйте NR, например, awk 'NR==3{..}' file означает выполнение для строки 3 - person ghostdog74; 26.03.2010
comment
Когда я сделал ваш первый вариант, но с 20 пробелами вместо 2 + «def», по какой-то причине он поместил пробелы на следующую строку. Ваше решение awk сработало отлично! спасибо - person Mitch; 21.08.2014

for file in ${thousands_of_files} ; do
    sed -i ".bak" -e "s/$/  def/" file
done

Ключевым моментом здесь является команда поиска и замены s///. Здесь мы заменяем конец строки $ на 2 пробела и вашу строку.

Документацию по sed можно найти по адресу http://sed.sourceforge.net/#docs.

person Chen Levy    schedule 25.03.2010
comment
большое спасибо. только один вопрос, делая это на OSX, почему появляется символ ^M? - person Open the way; 25.03.2010
comment
IIRC, конец строки - конечные символы EOL в Unix, Mac и Windows разные. sed — это утилита Unix, поэтому она использует соглашение Unix, т. е. заканчивая каждую строку возвратом каретки — CR (^ M), в то время как macs использует перевод строки — LF (^ L), Windows BTW использует CR, LF. Дело в том, что у вас остался символ Unix EOL. Я не гуру Mac, но должна быть утилита, чтобы исправить это. В моем Linux-боксе есть dos2unix и unix2dos, но если вы не можете найти такой инструмент, попробуйте использовать tr '\r' '\f', чтобы получить аналогичный эффект. - person Chen Levy; 26.03.2010
comment
Одно примечание: компьютеры Mac использовали CR (^M) ('\r') до OS X, после чего они переключились на LF (^L) ('\n'). UNIX всегда использовал LF (^L). Вы правы, когда сказали, что Windows использует CRLF (^M^L) (\r\n). - person amertune; 09.04.2010