ฉันจะเพิ่มสตริงหลังจากแต่ละบรรทัดในไฟล์โดยใช้ bash ได้อย่างไร สามารถทำได้โดยใช้คำสั่ง sed ถ้าเป็นอย่างไร
ฉันจะเพิ่มสตริงหลังจากแต่ละบรรทัดในไฟล์โดยใช้ bash ได้อย่างไร สามารถทำได้โดยใช้คำสั่ง sed ถ้าเป็นอย่างไร
คำตอบ:
หากคุณsed
อนุญาตให้แก้ไขผ่าน-i
พารามิเตอร์:
sed -e 's/$/string after each line/' -i filename
ถ้าไม่คุณต้องสร้างไฟล์ชั่วคราว:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
sed -e 's/^/string after each line/' -i filename
$ หมายถึง end-of-line ^ หมายถึงจุดเริ่มต้นของบรรทัด
sed 's/^/string after each line/'
จะทำในสิ่งที่ฉันคาดหวัง (ล่วงหน้าไปยังแต่ละบรรทัด) แต่sed 's/^/string after each line/'
ไม่ทำ (มันจะแทนที่ทั้งบรรทัดด้วยสตริงต่อท้ายของฉัน) สิ่งที่ช่วยให้? ความคิดใด ๆ @TomDeGisi?
ฉันชอบใช้awk
. หากมีเพียงคอลัมน์เดียวให้ใช้$0
หรือแทนที่ด้วยคอลัมน์สุดท้าย
ทางเดียว,
awk '{print $0, "string to append after each line"}' file > new_file
หรือนี่
awk '$0=$0"string to append after each line"' file > new_file
NR
ตัวแปรได้:awk '{print $0, NR}'
sed 's/ //g'
สิ่งนี้ใช้ได้กับความต้องการของฉัน แต่จะลบช่องว่างในทุกบรรทัดนั่นคือตัวเลือกg
สำหรับและทุกที่ในบรรทัด
,
{print $0"string to append after each line"}
ถ้าคุณมีมันลำ (ลามิเนต) ยูทิลิตี้สามารถทำมันได้ตัวอย่างเช่น:
$ lam filename -s "string after each line"
เปลือก POSIXบริสุทธิ์และsponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
และprintf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
ใช้join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
เครื่องมือเชลล์ใช้paste
, yes
, head
& wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
หมายเหตุที่paste
แทรกแท็บ$suffix
ถ่านก่อน
แน่นอนว่าsponge
สามารถแทนที่ด้วยไฟล์ temp ได้หลังจากนั้นก็แทนที่mv
ชื่อไฟล์เดิมเช่นเดียวกับคำตอบอื่น ๆ ...
sed
เว้นแต่ทรัพยากรจะมี จำกัด มาก
sed
ไม่จำเป็นสำหรับงานง่ายๆเช่นนี้
echo
ฉันชอบ ใช้ทุบตีบริสุทธิ์:
cat file | while read line; do echo ${line}$string; done
Sed นั้นน่าเกลียดเล็กน้อยคุณสามารถทำได้อย่างหรูหราเช่นนี้:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo
; ทำ echo $ {i} bar; ทำ foobar barbar bazbar แต่หลังจากการทดสอบบางอย่างฉันอาจจะคิดผิดเกี่ยวกับเหตุผลของฉัน แต่เดนนิสพูดถูก
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
ซึ่งพิมพ์ 2 บรรทัดแม้ว่าอินพุตจะเป็น 1 บรรทัดfoo bar
(และcat
การอ่านจาก stdin แทนที่จะเป็นไฟล์ก็ไม่ทำให้เกิดความแตกต่าง)
touch
ถึงไฟล์ชั่วคราว? และฉันจะทำให้sed
คำสั่งมีเงื่อนไขเกี่ยวกับความสำเร็จของcp
หรือต้นฉบับอาจสูญหายไป