สวัสดีฉันต้องการที่จะเพิ่มข้อความลงในไฟล์ ตัวอย่างเช่นฉันต้องการเพิ่มงานไปยังจุดเริ่มต้นของไฟล์ todo.txt ฉันรู้echo 'task goes here' >> todo.txt
แต่เพิ่มบรรทัดไปยังจุดสิ้นสุดของไฟล์ (ไม่ใช่สิ่งที่ฉันต้องการ)
สวัสดีฉันต้องการที่จะเพิ่มข้อความลงในไฟล์ ตัวอย่างเช่นฉันต้องการเพิ่มงานไปยังจุดเริ่มต้นของไฟล์ todo.txt ฉันรู้echo 'task goes here' >> todo.txt
แต่เพิ่มบรรทัดไปยังจุดสิ้นสุดของไฟล์ (ไม่ใช่สิ่งที่ฉันต้องการ)
คำตอบ:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
หรือ
sed -i '1s/^/task goes here\n/' todo.txt
หรือ
sed -i '1itask goes here' todo.txt
|
) ข้อความ ( echo '...'
) cat
ซึ่งใช้-
(อินพุตมาตรฐาน) เป็นไฟล์แรกและไฟล์todo.txt
ที่สอง cat
เชื่อมต่อหลายไฟล์ ส่งเอาท์พุท ( >
) temp
เพื่อไฟล์ชื่อ หากไม่มีข้อผิดพลาด ( &&
) จากcat
นั้นเปลี่ยนชื่อ ( mv
) temp
ไฟล์กลับไปเป็นไฟล์ดั้งเดิม ( todo.txt
)
cat
ได้รับแบ็กสแลชตามตัวอักษร n มันจะไม่แปลงเป็นบรรทัดใหม่ อย่างอื่นจะต้องทำอย่างนั้น แทนที่จะcat
ลองใช้ piping hexdump -C
เพื่อดูว่าคุณกำลังส่งแบ็กสแลชและ n หรือว่าเป็นบรรทัดใหม่ คุณสามารถลองcat -e
แสดงการจบบรรทัดได้
1
วิธีการทำคำสั่งต่อไปเท่านั้นในบรรทัดหนึ่งของไฟล์และi
คำสั่งแทรก ดูในหน้า man ภายใต้ส่วน "Addresses" และในส่วน "Zero- หรือ One-address command"
ตัวเลือกที่ง่ายกว่าในความคิดของฉันคือ:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
สิ่งนี้ได้ผลเพราะคำสั่งด้านในของ$(...)
ถูกดำเนินการก่อนที่จะtodo.txt
ถูกเขียนทับด้วย> todo.txt
ในขณะที่คำตอบอื่น ๆ ใช้งานได้ดีฉันพบว่าจดจำได้ง่ายกว่านี้เพราะฉันใช้เสียงสะท้อนและแมวทุกวัน
แก้ไข:วิธีนี้เป็นความคิดที่ดีมากหากมีเครื่องหมายแบ็กสแลชใด ๆ อยู่todo.txt
เนื่องจากต้องขอบคุณการ-e
สะท้อนธงจะตีความพวกเขา อีกวิธีที่ง่ายกว่าในการรับบรรทัดใหม่ในสตริงคำนำหน้าคือ ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... เพื่อใช้บรรทัดใหม่ แน่นอนว่ามันไม่ใช่ซับเดี่ยวอีกต่อไป แต่ในความเป็นจริงมันไม่ใช่ซับเดี่ยวมาก่อนเช่นกัน หากคุณทำสิ่งนี้ภายในสคริปต์และมีความกังวลเกี่ยวกับการเยื้อง (เช่นคุณกำลังเรียกใช้ฟังก์ชันนี้ภายในฟังก์ชัน) มีวิธีแก้ไขปัญหาเล็กน้อยเพื่อให้การทำงานนี้ยังคงเป็นไปได้อย่างสมบูรณ์รวมถึง แต่ไม่ จำกัด เพียง:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
นอกจากนี้หากคุณสนใจว่าจะเพิ่มการขึ้นบรรทัดใหม่todo.txt
หรือไม่อย่าใช้สิ่งเหล่านี้ ดียกเว้นคนที่สองถึงครั้งสุดท้าย ที่ไม่ยุ่งกับจุดจบ
-e
แปลงลำดับ escape ใน todo.txt ด้วยหรือไม่
moreutils
มีเครื่องมือที่ดีที่เรียกว่าsponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
มันจะ "ดูดซับ" STDIN จากนั้นเขียนไปยังไฟล์ซึ่งหมายความว่าคุณไม่ต้องกังวลกับไฟล์ชั่วคราวและย้ายไปมา
คุณจะได้รับmoreutils
มีหลาย Linux distros ผ่านapt-get install moreutils
หรือบน OS X โดยใช้Homebrewbrew install moreutils
ด้วย
(echo 'ble'; cat todo.txt)
:-)
คุณสามารถใช้ Vim ในโหมด Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
เลือกบรรทัดแรก
i
แทรก
x
บันทึกและปิด
คุณสามารถสร้างไฟล์ใหม่ชั่วคราว
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
นอกจากนี้คุณยังอาจใช้หรือsed
awk
แต่โดยทั่วไปสิ่งเดียวกันก็เกิดขึ้น
new_todo.txt
เขียนได้เพียงบางส่วนเท่านั้น วิธีการแก้ปัญหาของคุณดูเหมือนจะสูญเสียไฟล์ต้นฉบับ
rm
ไฟล์ต้นฉบับ
หากไฟล์ข้อความมีขนาดเล็กพอที่จะใส่ในหน่วยความจำคุณไม่จำเป็นต้องสร้างไฟล์ชั่วคราวเพื่อแทนที่ด้วย คุณสามารถโหลดมันทั้งหมดลงในหน่วยความจำและเขียนมันกลับออกไปที่ไฟล์
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
เป็นไปไม่ได้ที่จะเพิ่มบรรทัดไปยังจุดเริ่มต้นของไฟล์โดยไม่ต้องเขียนไฟล์ทั้งหมด
text=$(cat file)
. ระวังการใช้ข้อความเพียงอย่างเดียวเนื่องจากตัวแปรเชลล์ไม่ได้ทำความสะอาดแบบไบนารี่mywiki.wooledge.org/BashFAQ/058
คุณไม่สามารถแทรกเนื้อหาที่จุดเริ่มต้นของไฟล์ สิ่งเดียวที่คุณสามารถทำได้คือแทนที่เนื้อหาที่มีอยู่หรือผนวกไบต์หลังจากสิ้นสุดไฟล์ปัจจุบัน
วิธีแก้ไขปัญหาสำหรับคำถามของคุณนั้นต้องการไฟล์ชั่วคราว (หรือบัฟเฟอร์) ที่จะสร้าง (ในหน่วยความจำหรือดิสก์) ซึ่งจะเขียนทับไฟล์ต้นฉบับในที่สุด
ระวังอย่าให้ข้อมูลสูญหายโดยเก็บไฟล์ต้นฉบับไว้ในขณะที่สร้างไฟล์ใหม่หากระบบไฟล์เต็มในระหว่างกระบวนการ เช่น:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
ใช้งานได้ แต่cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
ให้ข้อผิดพลาด "echo: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"
<
และ(
จะทำลายไวยากรณ์ ลองcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
คุณสามารถใช้tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + หลายบรรทัด :
นี่เป็นรุ่นที่ช่วยให้คุณใช้สตริงหลายคู่สาย
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]