Додавання тексту до початку і кінця ряду файлів?


2

Я маю декілька файлів у ієрархії каталогів. Для кожного файлу, я хотів би додати "abcdef" до початку, по його власній лінії, і "ghijkl" до кінця, на його власному рядку. Наприклад, якщо файли спочатку містяться:

# one/foo.txt
apples
bananas

# two/three/bar.txt
coconuts

Потім я очікую, що вони містять:

# one/foo.txt
abcdef
apples
bananas
ghijkl

# two/three/bar.txt
abcdef
coconuts
ghijkl

Який найкращий спосіб це зробити?

Я отримав:

# put stuff at start of file
find . -type f -print0 | xargs -0 sed -i 's/.../abcdef/g'

# put stuff at end of file
find . -type f -print0 | xargs -0 sed -i 's/.../ghijkl/g'

але, здається, я не можу зрозуміти, як вкласти в еліпси.


Я не можу не помітити, наскільки простим і зрозумілим є це в Windows: for %i in (*) do echo abcdef>t.tmp & type "%i">>t.tmp & echo ghijkl>>t.tmp & move /y t.tmp "%i" або по черзі, echo abcdef>header.tmp & echo ghijkl>footer.tmp & for %i in (*) do copy /y headert.tmp+"%i"+footer.tmp "%i" & del header.tmp & del footer.tmp
Synetech

@Synetech: Чи працює це рекурсивно?
Dennis

1
@Dennis, як і для файлів у підтеках? Ні, але ви можете додати a /r до for цикл, щоб зробити його рекурсивним.
Synetech

Відповіді:


2

Це не робота sed. Щоб додати рядки, просто використовуйте Перенаправлення вводу-виводу .

Для одного файлу з ім'ям filename, можна виконати такі дії:

mv filename temp
(echo abcdef ; cat temp ; echo ghijkl) > filename
rm temp

Для цього автоматично використовуйте всі файли у поточному каталозі find і xargs:

find -type f -print0 | xargs -0 -I % sh -c '
    mv "%" temp
    (echo abcdef ; cat temp ; echo ghijkl) > "%"
'
rm temp

Я б запропонував налаштувати: (echo abcdef; cat filename; echo ghijkl) > temp;  cp temp filename;  rm temp, щоб зберегти атрибути (власник і режим) на файлах.
Scott

Це зробило мені трюк. Дякую!
John Feminella

Власність та дозволи можуть втратитися, просто перемістивши файл. Хороший момент, @Scott. Але копіювання, а не переміщення може прийти з великим покаранням продуктивності (якщо файли великі), тому я б використав chmod і chown з --reference у цьому випадку.
Dennis

2

Якщо у вас GNU sed, ви можете використовувати i\ і a\ конструкції:

Використовуйте адреси рядків для застосування до першого та останнього рядка відповідно:

find . -type f -print0 | xargs -0 sed -i -e '1i\abcdef' -e '$a\ghijkl'

Мені це здається більш елегантним, менш схильним до помилок і більш ефективним рішенням, ніж прийняте.
potong

-1
For files in directory as file
echo "abcde" && cat file && echo "fghijk" > file

1
Це не буде працювати з двох причин: 1. cat не echo. Він не буде друкувати abcdef але відображається помилка. 2. Вхідний файл і вихідний файл не можуть бути однаковими.
Dennis

Це також не спрацює. Це пише fghijk до file і видаляє все інше! З дужками він також не працюватиме, оскільки cat Вхідний і вихідний файли не можуть бути ідентичними.
Dennis

1
Будь ласка, не тільки здогадуйтеся, як вирішити проблему. Якщо ви цього не зробите знати Вирішіть проблему, зробіть час на дослідження (намагаючись це зробити не надто багато часу у цьому випадку) або утриматися від публікації припущень.
Daniel Beck

Шкода, що я просто дуже збудився: P Я постараюся контролювати себе в майбутньому: D
patrick_corrigan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.