ในprintf '%s\t%s\n' foo bar
, ไม่เอาท์พุทprintf
foo<TAB>bar<LF>
f
, o
, b
, a
และr
มีตัวอักษรกราฟิกเดียวกว้าง
เมื่อรับตัวอักษรเหล่านั้นเทอร์มินัลจะแสดงสัญลักษณ์และเลื่อนเคอร์เซอร์ไปหนึ่งคอลัมน์ทางด้านขวายกเว้นว่าได้มาถึงขอบด้านขวาของหน้าจอแล้ว (กระดาษในเครื่องพิมพ์ดีดดั้งเดิม) ซึ่งในกรณีนี้อาจป้อนบรรทัด และกลับไปที่ขอบด้านซ้ายของหน้าจอ (ตัด) หรือเพียงแค่ทิ้งอักขระขึ้นอยู่กับเทอร์มินัลและวิธีการกำหนดค่า
<Tab>
และ<LF>
เป็นอักขระควบคุมสองตัว <LF>
(aka newline) เป็นตัวคั่นบรรทัดในข้อความ Unix แต่สำหรับเทอร์มินัลเพียงป้อนบรรทัด (เลื่อนเคอร์เซอร์หนึ่งตำแหน่งลง) ดังนั้นไดรเวอร์เทอร์มินัลในเคอร์เนลจะแปลเป็นจริง<CR>
(กลับไปที่ขอบด้านซ้ายของหน้าจอ) <LF>
(เลื่อนเคอร์เซอร์ลง) ( stty onlcr
โดยทั่วไปจะเป็นค่าเริ่มต้น)
<Tab>
บอกให้เทอร์มินัลเลื่อนเคอร์เซอร์ไปที่แท็บหยุดถัดไป (ซึ่งในเทอร์มินัลส่วนใหญ่จะอยู่ห่างกัน 8 ตำแหน่งโดยค่าเริ่มต้น แต่ยังสามารถกำหนดค่าให้ตั้งค่าได้ทุกที่) โดยไม่ต้องเติมช่องว่างด้วยช่องว่าง
ดังนั้นหากอักขระเหล่านั้นถูกส่งไปยังเทอร์มินัลพร้อมแท็บหยุดทุก 8 คอลัมน์ในขณะที่เคอร์เซอร์อยู่ที่จุดเริ่มต้นของบรรทัดว่างนั่นจะส่งผลให้:
foo bar
พิมพ์บนหน้าจอที่บรรทัดนั้น หากพวกเขาถูกส่งในขณะที่เคอร์เซอร์อยู่ในตำแหน่งที่สามในบรรทัดที่มีxxxxyyyyzzzz
ที่จะส่งผลใน:
xxfooyyybarz
ในเทอร์มินัลที่ไม่สนับสนุนการจัดระเบียบคุณสามารถกำหนดค่าไดรเวอร์เทอร์มินัลให้แปลแท็บเหล่านั้นเป็นลำดับของช่องว่างได้ ( stty tab3
)
อักขระ SPC ในเครื่องพิมพ์ดีดดั้งเดิมจะย้ายเคอร์เซอร์ไปทางขวาขณะที่ backspace ( \b
) จะย้ายไปทางซ้าย ตอนนี้ในอาคารทันสมัย SPC ย้ายไปทางขวาและลบ (เขียนอักขระเว้นวรรคตามที่คุณคาดหวัง) ดังนั้นการจี้ของ\b
ต้องเป็นสิ่งที่ใหม่กว่า ASCII บนขั้วที่ทันสมัยที่สุดก็จริงลำดับตัวอักษร: <Esc>
, ,[
C
มีลำดับการหลีกเลี่ยงเพิ่มเติมเพื่อเลื่อนn
อักขระไปทางซ้ายขวาขึ้นลงหรือตำแหน่งใด ๆ บนหน้าจอ มีลำดับการหลีกเลี่ยงอื่น ๆ ที่จะลบ (เติมด้วยช่องว่าง) ส่วนของบรรทัดหรือภูมิภาคของหน้าจอ ฯลฯ
ลำดับผู้ที่มักจะใช้โดยการใช้งานภาพเหมือนvi
, lynx
, mutt
, dialog
ที่เขียนข้อความที่ตำแหน่งพลบนหน้าจอ
ในตอนนี้เทอร์มินัลอีมูเลเตอร์ X11 และอุปกรณ์อื่นที่ไม่ใช่ X11 อย่าง GNU screen
ช่วยให้คุณสามารถเลือกพื้นที่ของหน้าจอเพื่อคัดลอก เมื่อคุณเลือกส่วนหนึ่งของสิ่งที่คุณเห็นในตัวvi
แก้ไขคุณไม่ต้องการคัดลอกลำดับ escape ทั้งหมดที่ใช้ในการสร้างเอาต์พุตนั้น คุณต้องการเลือกข้อความที่คุณเห็นที่นั่น
เช่นถ้าคุณเรียกใช้:
printf 'abC\rAC\bB\t\e[C\b\bD\n'
ซึ่งจำลองเซสชั่นการแก้ไขที่คุณป้อนabC
กลับไปยังจุดเริ่มต้นให้แทนที่ab
ด้วยAC
, C
มีย้ายไปที่ป้ายแท็บถัดไปแล้วหนึ่งคอลัมน์มากขึ้นไปทางขวาแล้วสองคอลัมน์ไปทางซ้ายแล้วป้อนB
D
คุณเห็น:
ABC D
นั่นคือABC
ช่องว่าง 4 D
คอลัมน์
หากคุณเลือกที่ด้วยเมาส์ในxterm
หรือputty
พวกเขาจะจัดเก็บในส่วนที่เลือกABC
4 ตัวอักษรพื้นที่และไม่D
abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D
สิ่งที่เกิดขึ้นในการเลือกคือสิ่งที่ถูกส่งโดยprintf
แต่ผ่านการประมวลผลทั้งไดรเวอร์เทอร์มินัลและเทอร์มินัลอีมูเลเตอร์
สำหรับชนิดอื่น ๆ ของการเปลี่ยนแปลงให้ดู<U+0065><U+0301>
( e
ตามสำเนียงเฉียบพลันรวม) เปลี่ยนไป<U+00E9>
( é
แบบฟอร์มก่อนแต่ง) xterm
โดย
หรือecho abc
ว่าปลายถูกแปลไปโดยคนขับรถมินัลก่อนที่จะส่งไปยังสถานีหลังจากที่ABC
stty olcuc
ตอนนี้<Tab>
Like <LF>
เป็นหนึ่งในอักขระควบคุมบางตัวที่บางครั้งพบได้ในไฟล์ข้อความ (เช่น<CR>
ในไฟล์ข้อความ MSDOS และบางครั้ง<FF>
เป็นตัวแบ่งหน้า)
ดังนั้นเทอร์มินัลอีมูเลเตอร์บางคนเลือกที่จะคัดลอกเมื่อเป็นไปได้ในบัฟเฟอร์การคัดลอกเพื่อเก็บไว้ (โดยทั่วไปไม่ใช่กรณี<CR>
หรือ<LF>
แม้ว่า)
ยกตัวอย่างเช่นในอาคารเช่น VTE-based gnome-terminal
, คุณอาจจะเห็นว่าเมื่อคุณเลือกการส่งออกของprintf 'a\tb\n'
ในบรรทัดที่ว่างเปล่าgnome-terminal
ร้านค้าจริงa\tb
ในการเลือกแทน X11 a
, 7 b
ช่องว่างและ
แต่สำหรับการส่งออกของprintf 'a\t\bb\n'
ร้านค้ามันa
, 6 ช่องว่างและb
และสำหรับprintf 'a\r\tb\n'
, a
7 b
ช่องว่างและ
มีอีกหลายกรณีที่เทอร์มินัลจะพยายามคัดลอกอินพุตจริงเช่นเมื่อคุณเลือกสองบรรทัดหลังจากทำงานในprintf 'a \nb\n'
ที่ที่ส่วนท้ายที่มองไม่เห็นจะถูกเก็บรักษาไว้ หรือเมื่อเลือกสองบรรทัดจะไม่มีอักขระ LF เมื่อทั้งสองบรรทัดเกิดจากการตัดที่ขอบขวา
ตอนนี้ถ้าคุณต้องการเก็บเอาท์พุทของprintf
ลงในการX11
เลือกคลิปบอร์ดที่ดีที่สุดคือการทำมันโดยตรงเช่น:
printf 'foo\tbar\n' | xclip -sel c
โปรดทราบว่าเมื่อคุณวางลงในxterm
เทอร์มินัลหรืออื่น ๆ ส่วนใหญ่xterm
แล้วแทนที่\n
ด้วย\r
เพราะเป็นตัวละครที่xterm
ส่งเมื่อคุณกดEnter(และไดรเวอร์เทอร์มินัลอาจแปลมันกลับไป\n
)