Faylning birinchi satrida yangi satr (\ n) belgisini qanday qo'shish mumkin?

Bu Mac OSX terminalda uchun Menda faylni aytishim mumkin     file.txt

This is a file  
and it has some contents.  

uni o'zgartirish uchun buyruq kerak:
file.txt

(new line character inserted)      
This is a file  
and it has some contents
1
StackOverflow-ga xush kelibsiz! Kelajakda murojaat qilish uchun, bu savolga o'zingiz hal qilish uchun QUALIFIQ savollaringiz bu erda o'zingizga tegishli. SO hujjatiga qarang - MCVE sizning dasturiy muammoingiz qanday qilib yaratilishi va Qanday qilib so'rang , yaxshi savollar berish uchun yanada batafsil qo'llanma uchun.
qo'shib qo'ydi muallif ghoti, manba
Buni faqat bitta fayl uchun bajarishga harakat qilyapsizmi? Agar shunday bo'lsa, faylni matn muharriri ichida ochib bo'lmaydi, birinchi satrda Enter ni bosing va faylni saqlang.
qo'shib qo'ydi muallif Sedrick, manba
Men faqat 1 fayl uchun buni qilmayman. Yangi natija qo'shish uchun nodejs ning exec modulidan foydalanmoqdaman. Yangi satr qo'shishni istagan faylni mudhish kuzatuvchi bilan ishlash vaqtida beramiz.
qo'shib qo'ydi muallif Anantha Padmanaban, manba

7 javoblar

Buning uchun osxda ed dan foydalanishingiz mumkin:

printf '%s\n' 0a "" . w | ed -s file
3
qo'shib qo'ydi
Faqat OS X emas .. Men ed deb o'ylayman har joyda va abadiy edi. :)
qo'shib qo'ydi muallif ghoti, manba
ed POSIX ning bir qismidir; Bu, ehtimol, eng yaxshi javob. (Agar kimdir trubani talab qilmasa ex -c dan foydalangan holda o'zgartirmasa ...)
qo'shib qo'ydi muallif chepner, manba

Buni bash ichida bajarish mumkin, sed yoki cat kabi tashqi vositalarni ishlatishga hojat yo'q.

printf '\n%s' "$(< file.txt)"

O'zgartirilgan chiqimni "stdout" ga yozib qo'yishini unutmang. Bundan tashqari, sizning kirish faylingizdagi keyingi satrlarni ham chizishadi. Agar muammo bo'lsa, cat ga qaytib olasiz ...

( printf '\n'; cat file.txt )

Heck, agar uni qayta ishlatmoqchi bo'lsangiz, uni funksiyalashingiz mumkin:

prepend_newline() {
    printf '\n'; cat "$1"
}

Asl faylni almashtirishni xohlasangiz, vaqtinchalik fayl va bittadan foydalaning:

tmpf=$(mktemp fileXXXX)
trap "rm -f $tmpf" 0
printf '\n%s' "$(< file.txt)" > $tmpf &&
mv $tmpf file.txt

Albatta, bu ham mktemp , rm va mv dan boshlab bash uchun o'rnatilgan emas, balki "tashqi vositalar" foydasi yo'q.

Yana ko'chma seddan asoslangan eritma shunday bo'lishi mumkin:

sed -i.bak $'1s/^/\\\n/' file.txt

\ n ni kengaytira olish uchun sedga suyanish o'rniga, yangi versiyani boshqa sed versiyalarida ishlaydigan usul bilan kiritish uchun bash "formatni kengaytirish" ni ishlatadi.

Sharhlarda aytilganidek -i universal emas, faqat keng tarqalgan. Agar sizning kodingiz -i ni kiritmasa, yuqoridagi sarmoyani ko'ring.

2
qo'shib qo'ydi
@AnanthaPadmanaban - Ajoyib, men yordam bera olaman! Agar muammoingizni qoniqarli tarzda bajarmoqchi deb hisoblasangiz, iltimos savolning chap tarafidagi tasdiq belgisini bosishingiz mumkin.
qo'shib qo'ydi muallif ghoti, manba
@chepner - yangi qatorlarni ta'qib qilib, hmm, bu to'g'ri. Yangilandi. Va shunga qaramay, "ko'proq portativ" ga yangilangan. :-D (mutlaqo kimga kerak?)
qo'shib qo'ydi muallif ghoti, manba
@chepner, rost, lekin men faqat tarixiy deb o'ylardim. Mening taassurotim shuki, bu zaxira nusxada belgilarni formatlashdan ko'ra keng tarqalgan. Menga ma'rifat bera olasizmi? -i ni qo'llab-quvvatlamaydigan sed bilan qanday operatsion tizimlar jo'natiladi?
qo'shib qo'ydi muallif ghoti, manba
@EricRenouf - printf "% s" chindan ham keyingi chiziqdan chiqadi, lekin printf tufayli emas, balki $ (...) . Albatta, agar OP istasa, \ n qo'shishni osonlashtiradi.
qo'shib qo'ydi muallif ghoti, manba
sed -i portativ emas.
qo'shib qo'ydi muallif chepner, manba
Murphy qonuni: Siz -i ni qo'llab-quvvatlamaydigan sed kodini yuborasiz, shuning uchun kimdir, bir kun, bu javobni bir sed . Men bu noto'g'ri taklif deb aytmayapman, chunki uni portativ deb atash noto'g'ri.
qo'shib qo'ydi muallif chepner, manba
Faqatgina bir tagini yangi satrni tomosha qilmasdan, u hamma ni yangi satrlarni tomosha qiladi.
qo'shib qo'ydi muallif chepner, manba
printf echimlari mavjud bo'lsa, faylning oxirgi satrini bekor qilgan yangi satrni yo'qotadi.
qo'shib qo'ydi muallif Eric Renouf, manba
Sizning ko'chma sed-yechimingizni tekshirib ko'rdingiz va u ishlay boshladi. Baq fayli yaratildi, shuning uchun bu komandani ishlatib bo'ldim: sed -i '' $ '1s/^/\\\ n /' file.txt
qo'shib qo'ydi muallif Anantha Padmanaban, manba
echo -e "\n$(cat file.txt)" > file.txt

Biroq, @EricRenouf kabi, faylda boshqa qochib ketish tartiblari mavjud bo'lsa, ular kengaytiriladi.

2
qo'shib qo'ydi
@EricRenouf Buyruqlarni almashtirish jarayoni qayta yo'naltirish jarayoni boshlanishidan oldin bajariladi, shuning uchun bu tashvish emas.
qo'shib qo'ydi muallif chepner, manba
Agar matn fayliga \ t qo'yib, uni sinab ko'ring.
qo'shib qo'ydi muallif chepner, manba
Bundan tashqari, faylda xohlagan qochish tartibini kengaytirishi mumkin.
qo'shib qo'ydi muallif Eric Renouf, manba
Bundan tashqari, o'sha joyni qayta yo'naltirish bilan faylga \ n bilan murojaat qilishingiz mumkin, chunki qayta yo'naltirish birinchi bo'lib, faylni qisqartiradi va cat ishlamasligi kerak. Bu echo agar o'rnatilgan bo'lsa-da, bajarilmaydi
qo'shib qo'ydi muallif Eric Renouf, manba
@chepner Ushbu tushuntirish uchun sizga katta rahmat
qo'shib qo'ydi muallif Eric Renouf, manba
Siz birinchi fikringizni batafsil aytib bera olasizmi? Men matnli hujjatning boshida bo'sh satrni olaman \ n.
qo'shib qo'ydi muallif Swifting, manba
echo -e "\n$(cat file.txt)" > file.txt

Biroq, @EricRenouf kabi, faylda boshqa qochib ketish tartiblari mavjud bo'lsa, ular kengaytiriladi.

2
qo'shib qo'ydi
Agar matn fayliga \ t qo'yib, uni sinab ko'ring.
qo'shib qo'ydi muallif chepner, manba
@EricRenouf Buyruqlarni almashtirish jarayoni qayta yo'naltirish jarayoni boshlanishidan oldin bajariladi, shuning uchun bu tashvish emas.
qo'shib qo'ydi muallif chepner, manba
@chepner Ushbu tushuntirish uchun sizga katta rahmat
qo'shib qo'ydi muallif Eric Renouf, manba
Bundan tashqari, faylda xohlagan qochish tartibini kengaytirishi mumkin.
qo'shib qo'ydi muallif Eric Renouf, manba
Bundan tashqari, o'sha joyni qayta yo'naltirish bilan faylga \ n bilan murojaat qilishingiz mumkin, chunki qayta yo'naltirish birinchi bo'lib, faylni qisqartiradi va cat ishlamasligi kerak. Bu echo agar o'rnatilgan bo'lsa-da, bajarilmaydi
qo'shib qo'ydi muallif Eric Renouf, manba
Siz birinchi fikringizni batafsil aytib bera olasizmi? Men matnli hujjatning boshida bo'sh satrni olaman \ n.
qo'shib qo'ydi muallif Swifting, manba

Eng oddiy narsa ikki buyruqdan iborat:

{ printf '\n'; cat input.txt; } > tmp.txt && mv tmp.txt input.txt

Bu mumkin bo'lganidan kamroq samaraliroq, biroq u hamma burchaklar holatlarida to'g'ri.

1
qo'shib qo'ydi
"Hammasi" meni qaytarib olish uchun qaytib kelishini aytishi kerak edi. Symlinks bu holatda bir oz og'riqdir; hatto sed -i (hech bo'lmaganda men tekshirgan BSD versiyasi) bog'langan faylni joy-joyiga yangilash o'rniga yangi fayl yaratadi.
qo'shib qo'ydi muallif chepner, manba
"Barcha burchak ishi" tarkibiga simli aloqa orqali yozish kerakmi? So'ngra siz "to'g'ri" degan ma'noni anglatuvchi "bog'lanish o'rniga yangi fayl hosil qilamiz" degan ma'noni anglatadi.
qo'shib qo'ydi muallif Toby Speight, manba

Bo'sh qatorni kiritish uchun oddiy ed buyrug'i o'xshaydi

1i  # insert before line 1
    # blank line to insert
.   # end of insert
w   # write the file

Bu "Bash" buyrug'i bilan yozilishi mumkin

ed -s "$file" <<<$'1i\n\n.\nw'
0
qo'shib qo'ydi

sed bilan inline sarlavhasi buni amalga oshiradi:

sed -i '1s/^/\n/' file.txt
0
qo'shib qo'ydi
Bu GNU uchun ishlaydi, ammo boshqa variantlarga ko'chma emas.
qo'shib qo'ydi muallif ghoti, manba
@ghoti Bu to'g'ri. Shuni ta'kidlash kerakki, sed -i faylning o'zi emas, balki yuqori katalogda yozilish ruxsatini talab qiladi.
qo'shib qo'ydi muallif vdavid, manba