สามารถsed
ทำสิ่งที่ชอบ:
12345
กลายเป็น:
1&2&3&4&5
?
สามารถsed
ทำสิ่งที่ชอบ:
12345
กลายเป็น:
1&2&3&4&5
?
คำตอบ:
ด้วย GNU sed
:
sed 's/./\&&/2g'
( s
ubstituteทุก ( g
) ตัวอักษร ( .
) แบบเดียวกับที่ ( &
) นำหน้าด้วย&
( \&
) แต่เพียงเริ่มต้นจากการเกิดที่สอง ( 2
))
portably:
sed 's/./\&&/g;s/&//'
(แทนที่ทุกครั้งที่เกิดขึ้น แต่จากนั้นลบรายการแรก&
ที่เราไม่ต้องการ)
ด้วยawk
การใช้งานบางอย่าง(ไม่ใช่ POSIX เนื่องจากลักษณะการทำงานไม่ได้ระบุไว้สำหรับ FS ที่ว่างเปล่า):
awk -F '' -v OFS="&" '{$1=$1;print}'
(ที่มีgawk
และอื่น ๆ ไม่กี่awk
การใช้งานคั่นสนามว่างแยกบันทึกลงเป็นคนละตัวอักษร . the คั่นฟิลด์เอาท์พุท ( OFS
) ตั้ง&
. เรากำหนดค่าให้$1
(ตัวเอง) เพื่อบังคับให้บันทึกที่จะสร้างใหม่ที่มีตัวคั่นเขตข้อมูลใหม่ ก่อนที่จะพิมพ์NF=NF
ยังใช้งานได้และมีประสิทธิภาพมากขึ้นเล็กน้อยในการใช้งาน awk จำนวนมาก แต่พฤติกรรมเมื่อคุณทำเช่นนั้นในขณะนี้ยังไม่ได้ระบุโดย POSIX)
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
รันโค้ดสำหรับทุกบรรทัดและพิมพ์ผล ( $_
); -l
แถบและใหม่เพิ่มปลายสายโดยอัตโนมัติ-a
populates @F
กับแยกข้อมูลเกี่ยวกับชุดที่คั่นใน-F
. ซึ่งที่นี่เป็นสตริงว่างผลที่ได้คือการแยกตัวละครทุกตัวเข้า@F
, จากนั้นเข้าร่วมกับพวกเขาด้วย '&' และพิมพ์บรรทัด)
อีกวิธีหนึ่งคือ:
perl -pe 's/(?<=.)./&$&/g'
(แทนที่ตัวละครทุกตัวหากมีตัวละครอื่นนำหน้า (โอเปอเรเตอร์ regexp แบบมองหลัง (? <= ... ))
การใช้zsh
ตัวดำเนินการเชลล์:
in=12345
out=${(j:&:)${(s::)in}}
(อีกครั้งแบ่งในตัวคั่นฟิลด์ว่างโดยใช้การตั้งs::
ค่าสถานะการขยายพารามิเตอร์และเข้าร่วมกับ&
)
หรือ:
out=${in///&} out=${out#?}
(แทนที่ทุกสิ่งที่เกิดขึ้น (ก่อนหน้าตัวละครทุกตัว) ด้วยการ&
ใช้${var//pattern/replacement}
โอเปอเรเตอร์ ksh (แม้ว่าในksh
รูปแบบที่ว่างเปล่าหมายถึงอย่างอื่น แต่อย่างอื่นฉันไม่แน่ใจว่ามีอะไรอยู่bash
) และลบอันแรกด้วยการ${var#pattern}
ลอกPOSIX ผู้ประกอบการ)
การใช้ksh93
ตัวดำเนินการเชลล์:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
เป็นตัวดำเนินการ ksh93 glob เพื่อใช้นิพจน์ทั่วไปที่เหมือน perl (แตกต่างจาก perl's หรือ PCRE's แม้ว่า) (?=.)
เป็นโอเปอเรเตอร์ที่ดูล่วงหน้า: แทนที่อักขระที่ระบุหากตามด้วยอักขระอื่นด้วยตัวเอง ( \0
) และ&
)
หรือ:
out=${in//?/&\0}; out=${out#?}
(แทนที่ตัวละครทุกตัว ( ?
) ด้วย&
และตัวของมันเอง ( \0
) และเราลบอันยิ่งใหญ่ออก)
การใช้bash
ตัวดำเนินการเชลล์:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(เช่นเดียวกับzsh
's ยกเว้นว่าคุณจำเป็นต้อง@()
มี (ผู้ประกอบการ ksh glob ที่คุณต้องการextglob
ในbash
))
awk -F '' -v OFS="&" 'NF=NF'
ยูทิลิตี้ Unix:
fold -w1|paste -sd\& -
อธิบาย:
"fold -w1"
- จะตัดอักขระอินพุตแต่ละบรรทัดเข้ากับบรรทัดของตัวเอง
พับ - ตัดแต่ละบรรทัดอินพุตให้พอดีกับความกว้างที่ระบุ
-w, - width = WIDTH ใช้คอลัมน์ WIDTH แทนที่จะเป็น 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- จะรวมบรรทัดอินพุตเข้าด้วยกันโดยใช้&
เป็นตัวคั่น
วาง - ผสานเส้นของไฟล์
-s, - อนุกรมวางครั้งละหนึ่งไฟล์แทนที่จะเป็นแบบขนาน
-d, --delimiters = LIST ใช้อักขระซ้ำจาก LIST แทน TAB
%fold -w1|paste -sd\& -
1&2&3&4&5
(โปรดทราบว่าหากการป้อนข้อมูลมีหลายบรรทัดพวกเขาจะเข้าร่วมด้วย&
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
คำถามคือเฉพาะที่เกี่ยวกับ
sed
คำตอบที่ดีอยู่ด้านล่าง และฉันไม่เห็นอันตรายใด ๆ ในการสาธิตวิธีแก้ไขงานด้วยวิธีอื่น
"-w"
ขอบคุณ! "-"
, ในทางกลับกัน, ไม่จำเป็นต้องใช้ If no file operands are specified, the standard input shall be used
ใช้ sed
sed 's/./&\&/g;s/.$//'
sed 's/\B/\&/g'
\ B - ตรงกันทุกที่ แต่อยู่ในขอบเขตของคำ; นั่นคือมันตรงกับถ้าตัวละครทางด้านซ้ายและตัวอักษรทางด้านขวามีทั้งตัวอักษร "คำ" หรือตัวละครทั้งที่ไม่ใช่คำ
ข้อมูล: GNU sed คู่มือส่วนขยายแสดงออกปกติ
การทดสอบ:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
นี่จะช้ากว่าคำตอบอื่น ๆ เล็กน้อย แต่ก็ค่อนข้างชัดเจน:
echo 12345 | perl -lnE 'say join "&", split //'
นี่คือวิธีอื่น ส่วนแรกของการแสดงออกที่น่าดึงดูดใจจับตัวละครทุกตัวแล้วแทนที่ด้วยตัวละครและเครื่องหมายและ ส่วนที่สองจะลบเครื่องหมายและจากจุดสิ้นสุดของบรรทัด
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
ใช้งานได้กับอักขระหลายไบต์เช่นกัน
sed
สองครั้งsed
สคริปต์อาจมีหลายคำสั่ง:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
ข้อมูล