ฉันจะเพิ่มแท็กให้กับจุดเริ่มต้นของหลายไฟล์ได้อย่างไร


คำตอบ:


18
sed -i "1s/^/<?php /" file

( -iสำหรับการแก้ไขในสถานที่)

รุ่นพกพาเพิ่มเติม:

ed file <<!
1s/^/<?php /
wq
!

ดี - ที่บิตง่ายกว่าสิ่งที่ผมกำลังจะอธิบาย :)
วอร์เรน

ฉันต้องการเพิ่มส่วนขยายในอาร์กิวเมนต์ -i ที่นี่ คุณใช้ sed หรือ GNU sed หรือไม่

Richard: คนที่ฉันใช้อ้างว่าเป็น GNU sedและอนุญาตการเพิ่มส่วนต่อท้ายการสำรองข้อมูล
user1686

2
ฉันใช้ BSD sed และอนุญาตให้แก้ไขได้ แต่ฉันต้องให้ส่วนขยาย เช่น 'sed -i .bak "รูปแบบ" ไฟล์'

3
-iไม่สามารถเคลื่อนย้ายได้ไวยากรณ์จะแตกต่างกันระหว่างการนำไปใช้งานและแบ่งการเชื่อมโยง คุณควรใช้โปรแกรมที่ออกแบบมาเพื่อแก้ไขไฟล์
Chris Down

5

คุณสามารถใช้AWKตัวกรองแบบนี้

awk '{if (NR == 1) พิมพ์ "% s% s", "คำนำหน้า", $ 0; อื่นพิมพ์ $ 0} 'testfile> newfile

PREFIXสตริงคำนำหน้า php ของคุณอยู่ที่ไหน


5

ฉันยังไม่ได้แสดงความคิดเห็น แต่จะทำทั้งหมดในขั้นตอนเดียว:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

รักช่วยฉันชั่วโมง
Steve Hill

5

คุณสามารถทำได้ด้วย perl one-liner:

perl -0777 -p -i -e "s/^/hey /g" testfile

-0777กองกำลังไฟล์ slurping โหมดเพื่อให้ไฟล์ทั้งหมดจะถูกอ่านเป็นหนึ่งบรรทัด -pเปิดใช้งานการวนซ้ำ -iเปิดใช้งานการแก้ไขไฟล์ในตำแหน่ง ^ระบุจุดเริ่มต้นของบรรทัด

$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf

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

เมื่ออัพเดตไฟล์จำนวนมากคุณสามารถรันคำสั่งด้วย-i.backup${RANDOM}ตรวจสอบว่าไฟล์ทั้งหมดถูกอัพเดตอย่างถูกต้องจากนั้นลบไฟล์ทั้งหมดที่มีนามสกุลนั้น


1
"ค่า 0777 จะทำให้ Perl เพื่อ slurp ไฟล์ทั้งหมดเพราะไม่มีไบต์ทางกฎหมายกับค่านั้น" ดูsial.org/howto/perl/one-liner/#s3.5
Chris W. Rea

1
หากคุณแนะนำให้ใช้ของ-iธงโดยไม่ต้องต่อท้ายกรุณาเตือนผู้อ่านที่นี้หมายถึงคุณจะได้รับไม่มีการสำรองข้อมูล สำหรับอีกสองสามตัวอักษร ( -i.bak) คุณจะได้รับการสำรองข้อมูลในกรณีที่สายการบินหนึ่งของคุณมีการพิมพ์ผิด พิมพ์ผิดค่อนข้างง่าย (พูดลืม-pธง) สามารถทำลายทั้งวันของคุณเป็นอย่างอื่น
Telemachus

@Telemachus - เห็นด้วย Updated

4

sedใช้สำหรับแก้ไขสตรีม - ไฟล์ไม่ใช่สตรีม ใช้โปรแกรมที่มีความหมายสำหรับวัตถุประสงค์นี้เหมือนหรือed ตัวเลือกที่จะไม่ได้เป็นเพียงไม่พกพาก็ยังจะทำลาย symlinks ใด ๆ ที่คุณอาจพบเพราะมันเป็นหลักจะลบมันและสร้างมันซึ่งเป็นจุดหมายex-ised

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done

สิ่งที่คุณนำเสนอเป็นวิธีพื้นฐานในการแก้ไขไฟล์เดียว สิ่งนี้ดูเหมือนจะไม่ตอบปัญหา - คำถามนี้เกี่ยวกับการแก้ไขจำนวนไฟล์ (แม้ว่าอาจจะไม่ชัดเจนในตอนแรก) หากคุณรู้วิธีใช้edเพื่อจุดประสงค์ดังกล่าวให้แสดงสิ่งนี้ในคำตอบของคุณ
rozcietrzewiacz

@rozcietrzewiacz - เนื่องจาก grawity แสดงวิธีการเดียวกันในการแก้ไขไฟล์เดียว (ที่ได้รับการยอมรับ) ฉันคิดว่ามันเหมาะสมกับคำตอบ ทั้งสองวิธีฉันใส่มันไว้ในลูปซึ่งจะช่วยลดความกังวลของคุณ
Chris Down

0

ทางเลือกอื่นสำหรับสิ่งที่คุณเขียนเพื่อเพิ่มบางสิ่งลงในส่วนท้ายของทุกไฟล์ในไดเรกทอรี (ในbash):

for FNAME in *
do
    echo "?>" >> $FNAME
done

แม้ว่าฉันจะชอบfindหนึ่งซับของคุณ:)


$FNAMEควรจะ$fname- โดยการประชุมเราใช้ประโยชน์จากตัวแปรสภาพแวดล้อม (PAGER, EDITOR, SHELL, ... ) และตัวแปรเชลล์ภายใน (BASH_VERSION, RANDOM, ... ) ชื่อตัวแปรอื่น ๆ ทั้งหมดควรมีตัวอักษรพิมพ์เล็กอย่างน้อยหนึ่งตัว อนุสัญญานี้หลีกเลี่ยงการแก้ไขตัวแปรสภาพแวดล้อมและภายในโดยไม่ตั้งใจ
Chris Down

@ Chris ลง - การประชุมที่ฉันได้เห็นทั้งอาชีพของฉันมีความแตกต่างกันโดยการตั้งค่า: พิมพ์เล็กพิมพ์ใหญ่และ CamelCase :)
วอร์เรน

อูฐและตัวพิมพ์เล็กนั้นใช้ได้ ไม่ว่าด้วยวิธีใดตัวแปรที่ไม่ใช่ตัวแปรสภาพแวดล้อมไม่ควรเป็นตัวพิมพ์ใหญ่เต็ม
Chris Down

0

มีวิธีง่าย ๆ

echo "startstr$(cat filename)endstring" > filename.new

สิ่งนี้จะทำลายด้วยการขึ้นบรรทัดใหม่
Chris Down

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