ฉันจะแทรกบรรทัดที่ด้านบนของไฟล์ข้อความโดยใช้บรรทัดคำสั่งได้อย่างไร


25

ฉันต้องการแทรกข้อความที่ด้านบนของไฟล์ที่มีอยู่แล้ว ฉันจะทำสิ่งนี้สำเร็จได้อย่างไร ฉันพยายามechoแล้วteeแต่ก็ไม่ประสบความสำเร็จ

ฉันพยายามแทรกบรรทัด repo ที่ด้านบนสุดของsources.listไฟล์จากเทอร์มินัล

บันทึก

ฉันต้องการวิธีแก้ปัญหาอย่างรวดเร็วหนึ่งบรรทัดเนื่องจากวิธีการของคำตอบอื่นเป็นที่รู้จักสำหรับฉันแล้ว


1
tee เพิ่มบรรทัดที่ด้านล่างของไฟล์เช่นecho "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- คุณต้องใช้ sudo ก่อนทีเพื่อรับสิทธิ์ผู้ดูแลระบบ แต่ทำไมบนโลกนี้คุณต้องการเพิ่มบางสิ่งบางอย่างที่ด้านบนสุดของแหล่งรายการ
Savvas Radevic

2
@medigeek: ที่ใดที่หนึ่งในประวัติคำถามของ OP คุณจะพบบางอย่างเกี่ยวกับการติดตั้ง / อัปเดตจาก CD-repo ... ฉันสงสัยว่าอาจเป็นเหตุผล ...
ish

ขอบคุณ @izx สมมติฐานของคุณถูกต้อง ฉันประทับใจในความเงียบ คุณสามารถตอบคำถามนั้นได้ไหม นั่นเป็นเรื่องเกี่ยวกับการติดตั้งจาก repo ในท้องที่โดยใช้ศูนย์ซอฟต์แวร์และยังตั้ง repo ในพื้นที่ของฉันสำหรับลำดับความสำคัญสูงสุดโดยไม่ต้องวางไว้ที่ด้านบน ขอบคุณอีกครั้ง.
Anwar

1
@izx นี่คือลิงค์เกี่ยวกับการตั้งค่าลำดับความสำคัญสูงสุดกับที่เก็บในเครื่องของฉัน ผมจะดีใจถ้าคุณยังสามารถตรวจสอบคำถามเกี่ยวกับศูนย์ซอฟแวร์ ขอบคุณอีกครั้งสำหรับความคิดเห็นแรกของคุณ ดีใจมาก
Anwar

1
@medigeek คุณสามารถดูคำถามนี้สำหรับคำอธิบายของคำถามที่ผิดปกติ
Anwar

คำตอบ:


38

จริงๆแล้วมันค่อนข้างง่ายด้วยsed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1iบอกให้ sed ใส่ข้อความที่ตามมาที่บรรทัดที่ 1 ของไฟล์ อย่าลืม\บรรทัดใหม่ในตอนท้ายเพื่อให้บรรทัดที่ 1 ที่มีอยู่ถูกย้ายไปที่บรรทัด 2


1
ขอบคุณ เพียงเพื่อทราบ: ถ้าคุณต้องการที่จะเปลี่ยนแทนการใส่ใช้แทนผมในs 1i
Anwar

3
น่าเศร้าที่สิ่งนี้ล้มเหลวสำหรับไฟล์ที่ว่างเปล่า (ไม่มีบรรทัดที่มีกำปั้นทำให้ไม่ต้องแทรกเลย)
Tino

@Tino สำหรับไฟล์เปล่าคุณสามารถใช้งานได้echo "Text Here" >> Filename
Flotolk

ไม่ทำงานบน MacOS 10
กฤษณะ

7

ในการแก้ไขทั่วไปในสถานที่ที่มีสคริปต์เป็นเรื่องยุ่งยาก แต่คุณสามารถใช้echoและcatจากนั้นmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

อย่างไรก็ตามถ้าคุณกำลังเล่นกับแหล่งรายการคุณต้องเพิ่มในการตรวจสอบและพิสูจน์อักษรแสดงหัวข้อย่อยเพื่อตรวจสอบข้อผิดพลาด ฯลฯ เพราะคุณไม่ต้องการที่จะหลวมนี้ แต่นั่นเป็นคำถามที่แยกต่างหาก :-)


ฉันสามารถทำสิ่งนั้นได้แล้ว ฉันต้องการโซลูชันหนึ่งบรรทัดตามที่ izx ให้ อย่างไรก็ตามขอบคุณสำหรับคำตอบของคุณ
Anwar

1
@AnwarShah - ขอโทษด้วย! คุณน่าจะพูดแบบนั้นในคำถามของคุณ :-)
Sean

ฉันยอมรับ +1 สำหรับคำตอบของคุณและสำหรับความคิดเห็นด้วย (ฉันไม่สามารถให้ได้มากกว่านี้)
Anwar

6
./prepend.sh "myString" ./myfile.txt

รู้ว่าprependเป็นเปลือกที่กำหนดเองของฉัน :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

ใช้เส้นทาง relatif หรือเส้นทางสัมบูรณ์ก็ควรทำงานได้ดี:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

อัปเดต:

หากคุณต้องการสคริปต์ถาวรสำหรับเรื่องนี้ให้เปิดnano /etc/bash.bashrcแล้วเพิ่มฟังก์ชั่นนี้ในตอนท้ายของไฟล์:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

เปิดเทอร์มินัลใหม่และเพลิดเพลินกับ:

prepend "another line at top" /path/to/my/file.txt

5

และทำไมไม่ใช้โปรแกรมแก้ไขข้อความของแท้สำหรับสิ่งนั้น edเป็นโปรแกรมแก้ไขข้อความมาตรฐาน

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

หรือถ้าคุณต้องการให้คำสั่งอ่านง่ายขึ้น:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: ไปที่บรรทัดแรก
  • i: โหมดแทรก
  • สิ่งที่คุณต้องการแทรก ...
  • .: หยุดการแทรกกลับไปที่โหมดปกติ
  • wq: เขียนและเลิกขอบคุณลาก่อน

วิธีการใช้การทดแทนตัวแปรเชลล์ (ในFIRST LINE) กับสิ่งนี้?
vp_arth

1
@vp_arth ถ้าเนื้อหาของคุณในตัวแปรแล้ว:first_line ed -s filename < <(printf '%s\n' 1i "$first_line" . wq)ตรวจสอบให้แน่ใจว่าตัวแปรไม่ได้ขยายเป็นจุดเดียวและไม่มีอักขระขึ้นบรรทัดใหม่
gniourf_gniourf

3

มีawkตัวเลือกอยู่เสมอ แทนที่stringตัวแปรด้วยเนื้อหาของคุณ นี่ไม่ใช่การเปลี่ยนแปลงในสถานที่แม้ว่า ส่วนตัวฉันมักจะไม่ทำการเปลี่ยนแปลงในสถานที่ นี่เป็นความชอบส่วนตัวอย่างแน่นอน สองสิ่งที่-vหมายถึงตัวแปรใน awk และตัวแปรจะใช้ที่นี่เพื่อให้ตรงกับหมายเลขบรรทัดได้อย่างมีประสิทธิภาพn NR == 1คุณสามารถใช้ในหลายวิธีใด ๆ เพียงแค่เปลี่ยนค่าของและns

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

ตัวอย่าง:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line

2

คุณสามารถใช้ Vim ในโหมด Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 เลือกบรรทัดที่ 1

  2. i แทรกบรรทัดใหม่ของข้อความ

  3. x บันทึกและปิด


ง่ายกว่าโซลูชันอื่น ๆ ที่ให้ไว้จนถึงปัจจุบัน ขอขอบคุณ.
Pothi Kalimuthu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.