ใส่ซับในหนึ่งอันเพื่อนำหน้าไฟล์


132

นี้น่าจะเป็นวิธีการแก้ปัญหาที่ซับซ้อน

ฉันกำลังมองหาตัวดำเนินการง่ายๆเช่น ">>" แต่สำหรับการสั่งซื้อล่วงหน้า

ฉันกลัวว่ามันจะไม่มีอยู่จริง ฉันจะต้องทำสิ่งที่ชอบ

 mv myfile tmp
 แมว myheader tmp> myfile

อะไรที่ฉลาดกว่านี้?


เกิดอะไรขึ้นmktemp? คุณสามารถล้างไฟล์ temp ได้ตลอดเวลาหลังจากนั้น ...
candu

ที่เกี่ยวข้อง: stackoverflow.com/questions/9533679/…
Anton Tarasenko

คำตอบ:


29

สับข้างล่างนี้เป็นคำตอบที่ปิดข้อมืออย่างรวดเร็วซึ่งจะทำงานและได้รับจำนวนมาก upvotes จากนั้นเมื่อคำถามเป็นที่นิยมมากขึ้นและเวลาผ่านไปมากขึ้นผู้คนที่โกรธเคืองเริ่มรายงานว่ามันใช้งานได้จริง แต่อาจมีสิ่งแปลก ๆ เกิดขึ้นได้หรือไม่ได้ผลเลยดังนั้นจึงถูกโหวตลงอย่างรุนแรงในช่วงเวลาหนึ่ง สนุกดังกล่าว.

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

ตอนนี้คำตอบคือ:


การสร้าง file descriptor อื่นสำหรับไฟล์ ( exec 3<> yourfile) ดังนั้นการเขียนไปที่ ( >&3) ดูเหมือนว่าจะเอาชนะปัญหาการอ่าน / เขียนในไฟล์เดียวกัน ใช้ได้กับฉันบนไฟล์ 600K ด้วย awk อย่างไรก็ตามการลองใช้เคล็ดลับเดียวกันโดยใช้ 'cat' ล้มเหลว

การส่งคำนำหน้าเป็นตัวแปรไปยัง awk ( -v TEXT="$text") จะเอาชนะปัญหาเครื่องหมายคำพูดตามตัวอักษรซึ่งป้องกันไม่ให้ทำเคล็ดลับนี้ด้วย 'sed'

#!/bin/bash
text="Hello world
What's up?"

exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3

3
คำเตือน: ตรวจสอบผลลัพธ์เพื่อให้แน่ใจว่าไม่มีอะไรเปลี่ยนแปลงนอกจากบรรทัดแรก ฉันใช้วิธีนี้และแม้ว่ามันจะได้ผล แต่ฉันสังเกตว่าดูเหมือนจะมีการเพิ่มบรรทัดใหม่ ฉันไม่เข้าใจว่าสิ่งเหล่านี้มาจากไหนดังนั้นฉันจึงไม่แน่ใจว่าวิธีนี้มีปัญหาจริงๆ แต่ระวังด้วย
conradlee

1
โปรดสังเกตในตัวอย่าง bash ด้านบนว่าเครื่องหมายคำพูดคู่จะครอบคลุมเหนือการส่งคืนค่าการขนส่งเพื่อแสดงให้เห็นถึงการสั่งจ่ายล่วงหน้าหลายบรรทัด ตรวจสอบเชลล์และโปรแกรมแก้ไขข้อความของคุณกำลังร่วมมือกัน \ r \ n อยู่ในใจ
John Mee

4
ใช้ด้วยความระมัดระวัง! ดูเหตุผลต่อไปนี้stackoverflow.com/questions/54365/…
Alex

3
หากตอนนี้ยังไม่น่าเชื่อถือลองอัปเดตคำตอบด้วยวิธีแก้ปัญหาที่ดีกว่า
zakdances

สับเป็นประโยชน์ถ้าหากมันเป็นที่รู้จักกันอย่างแม่นยำว่าทำไมการทำงานและดังนั้นภายใต้สิ่งที่สังเกตอย่างรอบคอบ จำกัด อย่างไรก็ตามการปฏิเสธความรับผิดชอบของคุณการแฮ็กของคุณไม่เป็นไปตามเกณฑ์เหล่านี้ ("ขึ้นอยู่กับระบบทั้งหมด", "ดูเหมือนจะเอาชนะ", "ได้ผลสำหรับฉัน") หากเราให้ความสำคัญกับข้อจำกัดความรับผิดชอบของคุณอย่างจริงจังไม่มีใครควรใช้การแฮ็กของคุณและฉันเห็นด้วย แล้วเราจะเหลืออะไร? สิ่งรบกวนที่มีเสียงดัง ผมเห็นสองตัวเลือก (ก) ลบคำตอบของคุณหรือ (ข) ทำให้มันกลายเป็นเรื่องเตือนที่อธิบายว่าทำไม - ดึงดูดเป็นมันอาจจะ - วิธีการนี้ไม่สามารถทำงานได้โดยทั่วไป
mklement0

103

ยังคงใช้ไฟล์ชั่วคราว แต่อย่างน้อยก็อยู่ในบรรทัดเดียว:

echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile

เครดิต: BASH: เพิ่มข้อความ / บรรทัดข้างหน้าไปยังไฟล์


5
-หลังจากทำcatอะไร?
makbol

มีวิธีเพิ่ม "ข้อความ" โดยไม่ต้องขึ้นบรรทัดใหม่หรือไม่?
chishaku

@chishakuecho -n "text"
Sparhawk

3
คำเตือน: ถ้าyourfileเป็น symlink สิ่งนี้จะไม่ทำตามที่คุณต้องการ
dshepherd

คำตอบนี้แตกต่างกันหรือไม่: echo "text"> / tmp / out; cat yourfile >> / tmp / ออก; mv / tmp / ออกไฟล์ของคุณ ??
Richard


20

John Mee: วิธีการของคุณไม่ได้รับการรับรองว่าจะใช้งานได้และอาจล้มเหลวหากคุณนำหน้าข้อมูลมากกว่า 4096 ไบต์ (อย่างน้อยนั่นคือสิ่งที่เกิดขึ้นกับ gnu awk แต่ฉันคิดว่าการใช้งานอื่น ๆ จะมีข้อ จำกัด ที่คล้ายกัน) ไม่เพียง แต่จะล้มเหลวในกรณีนั้น แต่จะเข้าสู่ลูปที่ไม่มีที่สิ้นสุดซึ่งจะอ่านเอาต์พุตของตัวเองซึ่งจะทำให้ไฟล์เติบโตขึ้นจนกว่าจะเต็มพื้นที่ว่างทั้งหมด

ลองด้วยตัวคุณเอง:

exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3

(คำเตือน: ฆ่ามันหลังจากนั้นสักครู่มิฉะนั้นมันจะเต็มระบบไฟล์)

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


6
นี่น่าจะเป็นความคิดเห็นไม่ใช่คำตอบแยกต่างหาก
lkraav

10
@Ikraav: อาจจะ แต่ "ความคิดเห็น" นั้นยาวและซับซ้อนมาก (และมีประโยชน์) มันจะดูไม่ดีและอาจไม่เหมาะกับความสามารถในการแสดงความคิดเห็นที่ จำกัด ของ StackOverflow
Hendy Irawan

18

เป็นไปไม่ได้หากไม่มีไฟล์ชั่วคราว แต่ที่นี่ต้องใช้โปรแกรม oneliner

{ echo foo; cat oldfile; } > newfile && mv newfile oldfile

คุณสามารถใช้เครื่องมืออื่น ๆ เช่น ed หรือ perl เพื่อทำได้โดยไม่ต้องใช้ไฟล์ temp


16

อาจเป็นที่น่าสังเกตว่าบ่อยครั้งเป็นความคิดที่ดีที่จะสร้างไฟล์ชั่วคราวอย่างปลอดภัยโดยใช้ยูทิลิตี้เช่นmktempอย่างน้อยถ้าสคริปต์จะถูกเรียกใช้ด้วยสิทธิ์ระดับรูท ตัวอย่างเช่นคุณสามารถทำสิ่งต่อไปนี้ (อีกครั้งใน bash):

(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )

15

หากคุณต้องการสิ่งนี้ในคอมพิวเตอร์ที่คุณควบคุมให้ติดตั้งแพ็คเกจ "moreutils" และใช้ "ฟองน้ำ" จากนั้นคุณสามารถทำได้:

cat header myfile | sponge myfile

1
สิ่งนี้ได้ผลดีสำหรับฉันเมื่อรวมกับคำตอบของ @Vinko Vrsalovic:{ echo "prepended text"; cat myfile } | sponge myfile
Jesse Hallett

13

การใช้ bash heredoc คุณสามารถหลีกเลี่ยงความจำเป็นในการใช้ไฟล์ tmp:

cat <<-EOF > myfile
  $(echo this is prepended)
  $(cat myfile)
EOF

ใช้งานได้เนื่องจาก $ (cat myfile) ได้รับการประเมินเมื่อสคริปต์ bash ได้รับการประเมินก่อนที่ cat ที่มีการเปลี่ยนเส้นทางจะถูกดำเนินการ


9

สมมติว่าไฟล์ที่คุณต้องการแก้ไขคือ my.txt

$cat my.txt    
this is the regular file

และไฟล์ที่คุณต้องการนำหน้าคือส่วนหัว

$ cat header
this is the header

ตรวจสอบให้แน่ใจว่ามีบรรทัดว่างสุดท้ายในไฟล์ส่วนหัว
ตอนนี้คุณสามารถนำหน้าด้วย

$cat header <(cat my.txt) > my.txt

คุณจบลงด้วย

$ cat my.txt
this is the header
this is the regular file

เท่าที่ฉันรู้สิ่งนี้ใช้ได้เฉพาะใน 'bash'


ทำไมถึงได้ผล? วงเล็บทำให้ cat กลางดำเนินการในเชลล์ที่แยกจากกันและถ่ายโอนไฟล์ทั้งหมดในครั้งเดียวหรือไม่
แมวสกุล

ฉันคิดว่า <(cat my.txt) สร้างไฟล์ชั่วคราวที่ใดที่หนึ่งในระบบไฟล์ ไฟล์นี้จะถูกอ่านก่อนที่ไฟล์ต้นฉบับจะถูกแก้ไข
cb0

มีคนเคยบอกฉันว่าคุณสามารถทำอะไรกับไวยากรณ์ "<()" ได้บ้าง อย่างไรก็ตามฉันไม่เคยเรียนรู้ว่าเมโทนี้เรียกว่าอย่างไรและฉันไม่พบบางสิ่งใน bash manpage หากมีใครทราบข้อมูลเพิ่มเติมโปรดแจ้งให้เราทราบ
cb0

1
ไม่ได้ผลสำหรับฉัน ไม่รู้ทำไม. ฉันใช้ GNU bash เวอร์ชัน 3.2.57 (1) -release (x86_64-apple-darwin14) ฉันใช้ OS X Yosemite ฉันลงเอยด้วยสองบรรทัดthis is the headerใน my.txt แม้ว่าฉันจะอัปเดต Bash ไป4.3.42(1)-releaseแล้วฉันก็ได้ผลลัพธ์เหมือนกัน
KohányiRóbert

1
Bash ไม่ได้สร้างไฟล์ชั่วคราว แต่จะสร้าง FIFO (ไปป์) ซึ่งคำสั่งในกระบวนการทดแทน ( <(...))เขียนดังนั้นจึงไม่มีการรับประกันว่าmy.txtจะอ่านแบบเต็มหน้าโดยที่เทคนิคนี้จะไม่ได้ผล
mklement0

9

เมื่อคุณเริ่มพยายามทำสิ่งที่ยากในเชลล์สคริปต์ฉันขอแนะนำอย่างยิ่งให้พิจารณาการเขียนสคริปต์ใหม่ในภาษาสคริปต์ที่ "เหมาะสม" (Python / Perl / Ruby / etc)

สำหรับการใส่บรรทัดไว้ล่วงหน้าในไฟล์นั้นจะไม่สามารถทำได้ผ่านการไพพ์เนื่องจากเมื่อคุณทำอะไรก็ตามที่ต้องการcat blah.txt | grep something > blah.txtจะทำให้ไฟล์ว่างโดยไม่ได้ตั้งใจ มีคำสั่งยูทิลิตี้ขนาดเล็กที่เรียกว่าspongeคุณสามารถติดตั้งได้ (คุณทำcat blah.txt | grep something | sponge blah.txtและบัฟเฟอร์เนื้อหาของไฟล์จากนั้นเขียนลงในไฟล์) มันคล้ายกับไฟล์ชั่วคราว แต่คุณไม่จำเป็นต้องทำอย่างชัดเจน แต่ฉันจะบอกว่านั่นเป็นข้อกำหนดที่ "แย่กว่า" มากกว่าพูดว่า Perl

อาจมีวิธีทำผ่าน awk หรือคล้ายกัน แต่ถ้าคุณต้องใช้เชลล์สคริปต์ฉันคิดว่าไฟล์ temp เป็นวิธีที่ง่ายที่สุด (/ เท่านั้น?) ..


7

เช่นเดียวกับ Daniel Velkov แนะนำให้ใช้ที
สำหรับฉันแล้วนั่นเป็นวิธีง่ายๆที่ชาญฉลาด:

{ echo foo; cat bar; } | tee bar > /dev/null

7

แก้ไข: สิ่งนี้เสีย ดูพฤติกรรมแปลก ๆ เมื่อเติมไฟล์ด้วย cat และ tee

วิธีแก้ปัญหาการเขียนทับคือการใช้tee:

cat header main | tee main > /dev/null

แขวนไว้สักพัก. ลงท้ายด้วย "tee: main: ไม่มีพื้นที่เหลือบนอุปกรณ์" main คือหลาย GB แม้ว่าไฟล์ข้อความต้นฉบับทั้งสองจะมีขนาดไม่กี่ KB
Marcos

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

1
คุณช่วยชี้แนวทางที่ระบุว่าควรลบคำตอบที่ผิดได้ไหม
Daniel

3

อันที่ฉันใช้ อันนี้ช่วยให้คุณระบุคำสั่งตัวอักษรพิเศษและอื่น ๆ ในแบบที่คุณชอบ:

echo -e "TEXTFIRSt\n$(< header)\n$(< my.txt)" > my.txt

PS: จะไม่ทำงานหากไฟล์มีข้อความที่มีแบ็กสแลชเท่านั้นทำให้ถูกตีความว่าเป็นอักขระหลีก


3

ส่วนใหญ่สำหรับกอล์ฟสนุก / เปลือก แต่

ex -c '0r myheader|x' myfile

จะทำเคล็ดลับและไม่มีท่อหรือการเปลี่ยนเส้นทาง แน่นอนว่า vi / ex ไม่ได้มีไว้สำหรับการใช้งานแบบไม่โต้ตอบดังนั้น vi จะกระพริบสั้น ๆ


สูตรที่ดีที่สุดจากมุมมองของฉันเนื่องจากใช้คำสั่งหน้าที่และทำอย่างตรงไปตรงมา
Diego

2

ทำไมไม่ใช้คำสั่ง ed (ตามที่แนะนำโดย fluffle ที่นี่)?

ed อ่านไฟล์ทั้งหมดลงในหน่วยความจำและทำการแก้ไขไฟล์ในสถานที่โดยอัตโนมัติ!

ดังนั้นถ้าไฟล์ของคุณไม่ใหญ่มาก ...

# cf. "Editing files with the ed text editor from scripts.",
# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed

prepend() {
   printf '%s\n' H 1i "${1}" . wq | ed -s "${2}"
}

echo 'Hello, world!' > myfile
prepend 'line to prepend' myfile

วิธีแก้ปัญหาอื่นคือใช้การจัดการไฟล์แบบเปิดตามที่แนะนำโดยJürgenHötzelในการเปลี่ยนเส้นทางเอาต์พุตจาก sed 's / c / d /' myFile ไปยัง myFile

echo cat > manipulate.txt
exec 3<manipulate.txt
# Prevent open file from being truncated:
rm manipulate.txt
sed 's/cat/dog/' <&3 > manipulate.txt

ทั้งหมดนี้สามารถใส่ไว้ในบรรทัดเดียวได้แน่นอน


2

ตัวแปรในโซลูชันของ cb0 สำหรับ "no temp file" เพื่อนำหน้าข้อความคงที่:

echo "text to prepend" | cat - file_to_be_modified | ( cat > file_to_be_modified ) 

สิ่งนี้อาศัยการดำเนินการย่อยของเชลล์อีกครั้ง - the (.. ) - เพื่อหลีกเลี่ยงไม่ให้แมวปฏิเสธที่จะมีไฟล์เดียวกันสำหรับอินพุตและเอาต์พุต

หมายเหตุ: ชอบโซลูชันนี้ อย่างไรก็ตามใน Mac ของฉันไฟล์ต้นฉบับหายไป (คิดว่าไม่ควรทำ แต่เป็นเช่นนั้น) ซึ่งสามารถแก้ไขได้โดยการเขียนโซลูชันของคุณเป็น: echo "text to prepend" | แมว - file_to_be_modified | แมว> tmp_file; mv tmp_file file_to_be_modified


1
ฉันพบว่าไฟล์ต้นฉบับสูญหายเช่นกัน Ubuntu Lucid
Hedgehog



2

คำเตือน: ต้องทำงานเพิ่มอีกเล็กน้อยเพื่อตอบสนองความต้องการของ OP

ควรมีวิธีที่จะทำให้แนวทางใจเย็นโดย @shixilun ทำงานได้แม้จะมีความไม่พอใจก็ตาม ต้องมีคำสั่ง bash เพื่อหลีกเลี่ยงช่องว่างเมื่ออ่านไฟล์ในสตริงทดแทน sed (เช่นแทนที่อักขระขึ้นบรรทัดใหม่ด้วย '\ n' คำสั่งเชลล์visและcatสามารถจัดการกับอักขระที่พิมพ์ไม่ได้ แต่ไม่ใช่ช่องว่างดังนั้นสิ่งนี้จะไม่แก้ปัญหาของ OP ปัญหา:

sed -i -e "1s/^/$(cat file_with_header.txt)/" file_to_be_prepended.txt

ล้มเหลวเนื่องจากการขึ้นบรรทัดใหม่ดิบในสคริปต์การแทนที่ซึ่งจำเป็นต้องนำหน้าด้วยอักขระต่อเนื่องบรรทัด () และอาจตามด้วย & เพื่อให้เชลล์และมีความสุขเช่นคำตอบ SO นี้

sed มีขีด จำกัด ขนาด 40K สำหรับคำสั่งแทนที่การค้นหาที่ไม่ใช่โกลบอล (ไม่มีการต่อท้าย / g หลังรูปแบบ) ดังนั้นจึงน่าจะหลีกเลี่ยงปัญหาการบุกรุกบัฟเฟอร์ที่น่ากลัวของ awk ที่ anonymous เตือน


2
sed -i -e "1s/^/new first line\n/" old_file.txt

สิ่งที่ฉันกำลังมองหา แต่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม
masterxilo

2

ด้วย$ (command)คุณสามารถเขียนผลลัพธ์ของคำสั่งลงในตัวแปรได้ ดังนั้นฉันจึงทำสามคำสั่งในหนึ่งบรรทัดและไม่มีไฟล์ชั่วคราว

originalContent=$(cat targetfile) && echo "text to prepend" > targetfile && echo "$originalContent" >> targetfile

1

หากคุณกำลังเขียนสคริปต์ใน BASH จริงๆแล้วคุณสามารถออก:

cat - yourfile / tmp / out && mv / tmp / out yourfile

นั่นเป็นจริงในตัวอย่างที่ซับซ้อนคุณโพสต์ในคำถามของคุณเอง


บรรณาธิการแนะนำให้เปลี่ยนเป็นcat - yourfile <<<"text" > /tmp/out && mv /tmp/out yourfileอย่างไรก็ตามมันแตกต่างจากคำตอบของฉันพอสมควรที่ควรเป็นคำตอบของตัวเอง
Tim Kennedy

1

หากคุณมีไฟล์ขนาดใหญ่ (ไม่กี่ร้อยกิโลไบต์ในกรณีของฉัน) และเข้าถึง python สิ่งนี้เร็วกว่าcatโซลูชันท่อมาก:

python -c 'f = "filename"; t = open(f).read(); open(f, "w").write("text to prepend " + t)'


1

วิธีแก้ปัญหาด้วยprintf:

new_line='the line you want to add'
target_file='/file you/want to/write to'

printf "%s\n$(cat ${target_file})" "${new_line}" > "${target_file}"

คุณยังสามารถทำได้:

printf "${new_line}\n$(cat ${target_file})" > "${target_file}"

แต่ในกรณีนี้คุณต้องแน่ใจว่าไม่มีที่ใดเลย%รวมถึงเนื้อหาของไฟล์เป้าหมายเนื่องจากสามารถตีความและทำให้ผลลัพธ์ของคุณแย่ลงได้


2
สิ่งนี้ดูเหมือนจะระเบิด (และตัดทอนไฟล์ของคุณ!) หากคุณมีสิ่งใดในไฟล์เป้าหมายที่ printf ตีความว่าเป็นตัวเลือกการจัดรูปแบบ
Alan H.

echoดูเหมือนจะเป็นตัวเลือกที่ปลอดภัยกว่า echo "my new line\n$(cat my/file.txt)" > my/file.txt
Alan H.

@AlanH. ฉันเตือนถึงอันตรายในคำตอบ
user137369

อันที่จริงคุณเตือนเฉพาะเกี่ยวกับเปอร์เซ็นต์ใน${new_line}ไม่ใช่ไฟล์เป้าหมาย
Alan H.

คุณสามารถอธิบายเพิ่มเติมได้หรือไม่? นี่เป็นข้อแม้ IMO ที่ยิ่งใหญ่จริงๆ “ ที่ใดก็ได้” ไม่ได้ทำให้ชัดเจนมากนัก
Alan H.

1

คุณสามารถใช้บรรทัดคำสั่ง perl:

perl -i -0777 -pe 's/^/my_header/' tmp

โดยที่ -i จะสร้างการแทนที่ไฟล์แบบอินไลน์และ -0777 จะทำให้ไฟล์ทั้งหมดคลาดเคลื่อนและทำให้ ^ ตรงกับจุดเริ่มต้นเท่านั้น -pe จะพิมพ์ทุกบรรทัด

หรือถ้า my_header เป็นไฟล์:

perl -i -0777 -pe 's/^/`cat my_header`/e' tmp

โดยที่ / e จะอนุญาตให้มีการประเมินโค้ดในการแทนที่


0
current=`cat my_file` && echo 'my_string' > my_file && echo $current >> my_file

โดย "my_file" คือไฟล์ที่นำหน้า "my_string" ไป


ถ้าคุณไม่ต้องการให้ "เวทมนตร์" บางอย่างเริ่มเกิดขึ้นในตอนนี้การแทนที่ตัวแปรควรถูกยกมา
luis lavaire

0

ฉันชอบวิธีedของ @ fluffleที่ดีที่สุด ท้ายที่สุดแล้วบรรทัดคำสั่งของเครื่องมือใด ๆ จะสลับกับคำสั่งเอดิเตอร์แบบสคริปต์ก็เป็นสิ่งเดียวกัน ไม่เห็นว่าโซลูชันตัวแก้ไขสคริปต์ "ความสะอาด" มีน้อยกว่าหรือไม่

นี่คือซับเดียวของฉันต่อท้ายไฟล์.git/hooks/prepare-commit-msgใน repo .gitmessageเพื่อส่งข้อความ:

echo -e "1r $PWD/.gitmessage\n.\nw" | ed -s "$1"

ตัวอย่าง.gitmessage:

# Commit message formatting samples:
#       runlevels: boot +consolekit -zfs-fuse
#

ฉันทำ1rแทน0rเพราะนั่นจะทำให้บรรทัดว่างพร้อมเขียนอยู่ด้านบนของไฟล์จากเทมเพลตดั้งเดิม อย่าวางบรรทัดว่างไว้ด้านบนของคุณ.gitmessageคุณจะจบลงด้วยสองบรรทัดที่ว่างเปล่า -sระงับเอาต์พุตข้อมูลการวินิจฉัยของ ed

ในการทำสิ่งนี้ฉันได้ค้นพบว่าสำหรับกลุ่มคนที่ชื่นชอบมันก็ดีที่จะมี:

[core]
        editor = vim -c ':normal gg'

0

ตัวแปร ftw?

NEWFILE=$(echo deb http://mirror.csesoc.unsw.edu.au/ubuntu/ $(lsb_release -cs) main universe restricted multiverse && cat /etc/apt/sources.list)
echo "$NEWFILE" | sudo tee /etc/apt/sources.list

0

ฉันคิดว่านี่เป็นรูปแบบที่สะอาดที่สุดของ ed:

cat myheader | { echo '0a'; cat ; echo -e ".\nw";} | ed myfile

เป็นฟังก์ชัน:

function prepend() { { echo '0a'; cat ; echo -e ".\nw";} | ed $1; }

cat myheader | prepend myfile

0

IMHO ไม่มีโซลูชันเชลล์ (และจะไม่เป็นหนึ่งเดียว) ที่จะทำงานได้อย่างสม่ำเสมอและเชื่อถือได้ไม่ว่าไฟล์ทั้งสองจะมีขนาดเท่าใดmyheaderและmyfile. เหตุผลก็คือถ้าคุณต้องการทำเช่นนั้นโดยไม่เกิดซ้ำกับไฟล์ชั่วคราว (และโดยไม่ปล่อยให้เชลล์เกิดซ้ำแบบเงียบ ๆ ไปยังไฟล์ชั่วคราวเช่นผ่านโครงสร้างเช่นการexec 3<>myfileไปยังteeฯลฯ

โซลูชัน "ของจริง" ที่คุณกำลังมองหาจำเป็นต้องใช้กับระบบไฟล์ดังนั้นจึงไม่มีให้ใช้งานในพื้นที่ผู้ใช้และจะขึ้นอยู่กับแพลตฟอร์ม: คุณกำลังขอให้แก้ไขตัวชี้ระบบไฟล์ที่ใช้โดยmyfileเป็นค่าปัจจุบันของตัวชี้ระบบไฟล์ สำหรับmyheaderและแทนที่ในระบบแฟ้มEOFของมีการเชื่อมโยงเครือเดียวกับที่อยู่ในปัจจุบันระบบแฟ้มชี้myheader myfileนี่ไม่ใช่เรื่องเล็กน้อยและเห็นได้ชัดว่าไม่สามารถทำได้โดยผู้ใช้ที่ไม่ใช่ superuser และอาจไม่ใช่โดย superuser เช่นกัน ... เล่นกับ inodes ฯลฯ

คุณสามารถปลอมได้มากหรือน้อยโดยใช้อุปกรณ์ลูป ดูเช่นเธรด SOนี้

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