ฉันได้ดูรอบ ๆsedคำสั่งเพื่อเพิ่มข้อความลงในไฟล์ในบรรทัดเฉพาะ งานนี้เพิ่มข้อความหลังบรรทัด 1:
sed '1 a\
แต่ฉันต้องการเพิ่มก่อนบรรทัด 1 มันจะเป็น:
sed '0 a\
invalid usage of line address 0แต่ฉันได้รับข้อผิดพลาดนี้:
ข้อเสนอแนะใด ๆ
ฉันได้ดูรอบ ๆsedคำสั่งเพื่อเพิ่มข้อความลงในไฟล์ในบรรทัดเฉพาะ งานนี้เพิ่มข้อความหลังบรรทัด 1:
sed '1 a\
แต่ฉันต้องการเพิ่มก่อนบรรทัด 1 มันจะเป็น:
sed '0 a\
invalid usage of line address 0แต่ฉันได้รับข้อผิดพลาดนี้:
ข้อเสนอแนะใด ๆ
คำตอบ:
ใช้ตัวเลือกการsedแทรก ( i) ซึ่งจะแทรกข้อความในบรรทัดก่อนหน้า
sed '1 i\
อัปเดตคำถามของผู้เขียน:
เพื่อให้แก้ไขไฟล์ในสถานที่ - ด้วย GNU sed- ฉันต้องเพิ่ม
-iตัวเลือก:
sed -i '1 i\anything' file
นอกจากนี้ไวยากรณ์
sed -i '1i text' filename
สำหรับผู้ที่ไม่ใช่ GNU
คุณต้องกดปุ่มย้อนกลับทันทีหลังแบ็กสแลช1i\และหลังfirst_line_text:
sed -i '1i\
first_line_text
'
นอกจากนี้โปรดทราบว่าการใช้งานที่ไม่ใช่ของ GNU sed(ตัวอย่างเช่นหนึ่งใน macOS) จำเป็นต้องมีอาร์กิวเมนต์สำหรับการ-iตั้งค่าสถานะ (ใช้-i ''เพื่อให้ได้ผลเช่นเดียวกับ GNU sed)
-iตัวเลือก ฉันจะอัปเดตคำตอบของคุณก่อนที่จะยอมรับ
sed '1 i\this text is entered above the existing first line' fileงานได้สำหรับฉัน
sed (GNU sed) 4.2.2แค่ sed '1 i text to insert' -i fileมีเสน่ห์ ขอบคุณ
awkคำตอบที่ไม่ดีอันดับของฉันด้านล่าง สิ่งนี้น่าจะใช้ได้
Echo ใช้เพื่อรับข้อความ ชื่อไฟล์ Cat - พิมพ์ไฟล์ในคอนโซลและ> ใช้เพื่อส่งไปยังไฟล์ชื่อไฟล์ 1 อีกครั้งจากนั้นเราย้ายชื่อไฟล์ 1 ไปยังชื่อไฟล์เพื่อให้ข้อความแทรกลงในบรรทัดแรกของไฟล์ที่ต้องการ
(echo "some text" && cat filename) > filename1 && mv filename1 filename
คุณสามารถใช้ Vim ในโหมด Ex:
ex -sc '1i|ALFA BRAVO' -cx file
1 เลือกบรรทัดแรก
i แทรกข้อความและขึ้นบรรทัดใหม่
x บันทึกและปิด
คุณต้องการแทรกข้อความก่อนบรรทัดแรกแทนที่จะต่อท้ายเพื่อใช้
sed '1 i\
your_text' your_file
เอกสารที่นี่ยังสามารถช่วย:
cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
ใช้ GNU awk> = 4.1:
awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh
ตรงข้ามกับsedคำตอบทั้งหมดการทำงานกับไฟล์เปล่าเช่นกัน
inplaceเป็นห้องสมุดและน่าเสียดายที่มันปรากฏในการแจกแจง awk ทั้งหมดที่จัดส่ง ฉันได้รับ "awk: ร้ายแรง: ไม่สามารถเปิดไฟล์ 'inplace' เพื่ออ่าน" GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
sed -i '1i new_text' file_name
หากคุณไม่ได้ระบุ-iตัวเลือกมันจะไม่แสดงข้อผิดพลาดใด ๆ และแสดงผลลัพธ์บนเทอร์มินัลมาตรฐาน แต่ไม่ได้แทรกข้อความในไฟล์
-iสวิตช์
gnu sedเฉพาะเจาะจงและมันเกิดขึ้นที่gnu sedจะยอมรับiโดยไม่มีเครื่องหมายแบ็กสแลช) ถ้าคนอื่นคิดว่านี่รับประกันคำตอบที่แยกต่างหาก
0aคำสั่งที่คุณพยายามที่จะทำงานในexบรรพบุรุษเพื่อvi :
printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt
printfคำสั่งด้วยตัวเองเอาท์พุท:
0a
Anything you want to add
.
x
0aวิธีการผนวกหลังจากบรรทัด 0 (คือก่อนบรรทัดแรก)
บรรทัดถัดไปหรือหลายบรรทัดเป็นข้อความตัวอักษรที่จะเพิ่ม
.บนเส้นด้วยตัวเองยุติ "การผนวกคำสั่ง"
xสาเหตุที่ไม่ได้รับสิทธิในการบันทึกการเปลี่ยนแปลงไปยังแฟ้มและทางออก
ฉันประหลาดใจที่ในคำถามเก่านี้ไม่มีใครแสดงคำสั่ง sed (และง่ายมากในกรณีนี้) สามัญที่สุด:
$ sed -i '1s/^/new_text\
/' file_name
ซึ่งใช้งานได้กับหอยส่วนใหญ่และสามารถพกพาไปได้หลายรุ่น
หาก GNU sed พร้อมใช้งานคุณสามารถใช้สิ่งนี้:
$ sed -i '1s/^/new_text\n' file_name
ความแตกต่างคือ GNU sed อนุญาตให้ใช้ a \nสำหรับ newline และอื่น ๆ จำเป็นต้องขึ้นบรรทัดใหม่ตามตัวอักษรด้วย backslash (ซึ่งทำงานใน GNU sed อยู่ดี)
หากเชลล์ที่ยอมรับการ$'…'ใช้งานไวยากรณ์คุณสามารถแทรกขึ้นบรรทัดใหม่ได้โดยตรงดังนั้น sed จะเห็นว่ามีการขึ้นบรรทัดใหม่แล้ว:
$ sed -i $'1s/^/new_text\\\n/' file_name
ซึ่งใช้งานได้กับรุ่น sed มากขึ้น
น่าเสียดายที่คำตอบทั้งหมดข้างต้น (ส่วนใหญ่มีsed) ไม่ได้ผลสำหรับฉันเพราะพวกเขาทั้งหมดแทนที่บรรทัดแรก ฉันอยู่บนUbuntu 16.04 LTSเครื่อง นี่คือวิธีแก้ปัญหาของฉันด้วยGNU Awk 4.0.2:
awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
sedคำตอบเดียวที่ใช้การแทนที่ แต่ไม่ได้แทนที่บรรทัดที่มีอยู่
ฉันจะสมมติว่าทุกคนที่ค้นหาวิธีการแทรก / ต่อท้ายข้อความที่จุดเริ่มต้น / จุดสิ้นสุดของไฟล์อาจต้องทราบวิธีการทำเช่นกัน
cal | \
gsed -E \
-e '1i\{' \
-e '1i\ "lines": [' \
-e 's/(.*)/ "\1",/' \
-e '$s/,$//' \
-e '$a\ ]' \
-e '$a\}'
นี่เป็นcalเอาต์พุตที่ส่งไปยัง gnu- sed(เรียกว่าgsedบน macOS ที่ติดตั้งผ่านbrew.sh ) พร้อมกับขยาย RegEx ( -E) และ 6 "สคริปต์" ถูกนำไปใช้ ( -e) และตัวแบ่งบรรทัดหนีออกมา\เพื่อความสะดวกในการอ่าน สคริปต์ 1 & 2 ใช้1i\เพื่อ "ที่บรรทัด 1, แทรก" สคริปต์ 5 & 6 ใช้$a\เพื่อ "at line <last>, ผนวก" ฉันจัดแนวเอาท์พุทข้อความในแนวตั้งเพื่อให้โค้ดแสดงสิ่งที่คาดหวังในผลลัพธ์ สคริปต์ 3 และ 4 ทำการทดแทน (รายการหลังใช้กับ "บรรทัด <last>" เท่านั้น) ผลลัพธ์กำลังแปลงเอาต์พุตคำสั่งเป็น JSON ที่ถูกต้อง
{
"lines": [
" October 2019 ",
"Su Mo Tu We Th Fr Sa ",
" 1 2 3 4 5 ",
" 6 7 8 9 10 11 12 ",
"13 14 15 16 17 18 19 ",
"20 21 22 23 24 25 26 ",
"27 28 29 30 31 ",
" "
]
}
1iการแทรกข้อความก่อนบรรทัดแรก บางคนที่มีคำถามนี้จะต้องแยกส่วนที่พวกเขาต้องการจากคำตอบของคุณเพื่อแก้ปัญหาของพวกเขา คำถามฟรีดังนั้นฉันขอเชิญคุณถามและตอบคำถามของคุณเองเพื่อให้คำตอบเฉพาะของคุณ