Як додати текст до початку та в кінці декількох текстових файлів у Bash?


24

У мене каталог із текстовими файлами. Моя мета - додати текст до початку і в кінці всіх. Текст, який йде на початку та в кінці, однаковий для кожного файлу.

На основі коду, який я отримав з Інтернету, це код для додавання до початку файлу:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

Це код для додавання до кінця файлу. Мета - додати текст };у кінці кожного файлу:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

Приклади, з яких я черпав, були для дії на окремі файли. Я думав , що я хотів би спробувати , що діють на кілька файлів , використовуючи символи узагальнення, *.txt.

Я можу робити й інші помилки. У будь-якому випадку, як я додаю текст до початку та в кінці декількох файлів?

Відповіді:


27

Щоб додати текст до файлу, який ви можете використовувати (з реалізацією GNU sed):

sed -i '1i some string' file

Текст, що додається, так само просто

echo 'Some other string' >> file

Останнє, що потрібно зробити - це поставити це в цикл, який повторює всі файли, які ви бажаєте редагувати:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done

8

Можна використовувати GNU sed

Як уже проілюстровано, ви можете вставляти рядки тексту безпосередньо до і після відповідності рядків файлу sed, використовуючи відповідно iі aкоманду. Що ще не показано, це те, що ви можете зробити це за допомогою одного вкладиша та для кількох файлів одночасно.

Далі буде вставлено рядок перед першим 1iі після останнього рядка $a. Вставки виконуватимуться для всіх файлів, що відповідають глобальному *.txt.

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

І обидва, iі aне працюють лише з номерами рядків, але і з кожним рядком, який відповідає заданому шаблону. Це буде вставляти коментар, коли рядок містить var y = 2;:

sed -i -- '/var y = 2;/i//initialize variable y' *.js

5

Повністю POSIX сумісна команда, використовуючи ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

Якщо ви запустите printfчастину команди самостійно, ви побачите точні команди редагування, які вона передає ex:

0a
var language = {
.
$a
};
.
x

0aозначає "Додавання тексту після рядка 0" (іншими словами, перед першим рядком). Наступний рядок - це буквальний текст, який слід "додати" після рядка 0. Період ( .) у рядку сам по собі закінчує доданий текст.

$a означає додавати текст після останнього рядка файлу.

x означає зберегти зміни та вийти.


2

Ось як це зробити в Perl:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done

@ Додавання StéphaneChazelas -iзамість цього файлу заміни не працює, він просто друкує до stdout.
Олег Припін

@OlehPrypin, справді ваше право. Коментар видалено.
Стефан Шазелас

1

Спробуйте скористатися ex:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

де команди:

  • bufdo!виконує команди нижче для кожного відкритого буфера / файлу (зверніть увагу: це не POSIX )
  • 1s/^/HEAD/- вставляє HEADтекст у перший рядок на початку рядка
  • $s/$/TAIL/- додає TAILтекст в останньому рядку в кінці рядка

та аргументи:

  • -s - безшумний / швидкий режим
  • -cxa - збережіть усі відкриті буфери / файли та вийдіть
  • *.foo- всі файли в поточному каталозі ( *) з fooрозширенням, використанням **/*.fooдля рекурсії (після включення globstar: shopt -s globstar)


1
@StevenPenny має рацію. Я використовую визначені POSIX функції лише особисто для сценаріїв редагування.
Wildcard

1

С gnu awk, використовуючи inplaceрозширення та BEGINFILE/ ENDFILE:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt

1

Також має право бути (з результатами у .outфайлах):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

Ще один, більш розроблений варіант - вихідні файли замінені на результат:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print

0

Perl один лайнер на допомогу:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.