Добавьте строку к текстовому файлу от терминала

Я хотел бы изменить набор текстовых файлов от терминала, большего количества precisey:

добавьте строку '50' к первой строке каждого текстового файла в/mydat/?

С другой стороны, если Вы знаете о ссылке на страницу в сети, которая перечисляет команды для управления текстовыми файлами от оболочки...

6
задан 3 November 2010 в 00:34

5 ответов

find и sed - ваше предпочтительное оружие:

find /mydat/ -exec sed '1i 50' {} \;

Это наклеит 50, за которым следует новая строка в начале файла.

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

sed '1i 50' *
0
ответ дан 3 November 2010 в 00:34

Для редактирования файла Вам нужен редактор. ed и ex примеры основанных на команде редакторов, который полезен для редактирования файлов из сценария. Вот пример, вставляющий строку в каждый файл с .txt расширением в/mydata, с помощью редактора:

#!/bin/bash
for file in /mydata/*.txt; do
    printf '%s\n' 0a 50 . w | ed -s "$file"
done

Это обработает все виды нечетных символов в именах файлов также, в отличие от всего использования в качестве примера for- циклы с ls в ответах, данных до сих пор.

Вот ссылка, описывающая, как использовать редактора: http://bash-hackers.org/wiki/doku.php?id=howto:edit-ed

Для понимания удара я настоятельно рекомендую читать http://mywiki.wooledge.org/BashGuide

3
ответ дан 3 November 2010 в 00:34

Относительно просто добавить текст в конец файлов. Для BASH: echo 50 >> file.txt добавит 50 в конец файла file.txt. Оберните это в цикл for следующим образом: for $FILE in 'ls' do echo 50 >> $FILE; done; for $FILE in * do echo 50 >> $FILE; done; будет перебирать все файлы в текущем каталоге, добавляя 50 к концу. Обратите внимание, что одинарные кавычки на самом деле `, но здесь есть индикатор для разметки кода ... blech. Чтобы добавить его в начало каждого файла, создайте временный файл и введите в него 50 символов, затем эхо содержимое файла после этого. Затем переименуйте файл, чтобы перезаписать оригинал. Заверните его в скрипт, и все готово!

#!/bin/bash

echo "Adding 50 to each file in current directory."

for $FILE in *
do
[[ -f "$i" ]] || continue
echo "50" >> tmp
cat "$FILE" >> tmp
mv tmp "$FILE"
done

Это должно сработать, но запустите его в тестовом каталоге, прежде чем что-то важное.

Редактировать: Обновлен скрипт, как предложено в комментарии Махеша.

0
ответ дан 3 November 2010 в 00:34

Как вы и спросили, commandlinefu.com перечисляет кучу команд и трюков для использования в оболочке, и в нем есть много вещей, касающихся манипулирования текстовыми файлами.

0
ответ дан 3 November 2010 в 00:34

По сути, вам нужно перебрать каждый текстовый файл в каталоге, а затем добавить небольшую строку в начало. Это не сложно, если разбить его на два этапа.

Чтобы добавить строку в начало файла, формат будет следующим:

echo "50 $( cat file.txt )" > file.txt

Если вы получили ошибку cannot overwrite existing file, вам необходимо отключить noclobber

set +o noclobber
[ 1112] Теперь вам просто нужно поместить это в цикл, который просматривает файлы, которые вы хотите изменить.

for FILE in $( ls /mydata/ | grep txt$ ) ; do
  echo "${FILE}"
done

Если при этом выводятся все файлы, которые вы хотите изменить правильно, добавьте команду для изменения файлов (как показано ниже). Если нет, изменяйте оператор grep, пока он не будет соответствовать тому, что вам нужно.

for FILE in $( ls /mydata/ | grep txt$ ) ; do
  echo "50 $( cat ${FILE} )" > "${FILE}"
done

И если вы хотите, чтобы это было сделано в одну строку:

for FILE in $( ls /mydata/ | grep txt$ ) ; do echo "50 $( cat ${FILE} )" > "${FILE}"; done

Редактировать

Если вы хотите, чтобы 50 были в отдельной строке, используйте printf вместе с \n эхо, как показано ниже.

for FILE in $( ls /mydata/ | grep txt$ ) ; do printf "50\n$( cat ${FILE} )" > "${FILE}"; done
0
ответ дан 3 November 2010 в 00:34

Другие вопросы по тегам:

Похожие вопросы: