วิธีแทนที่ช่องว่างด้วยการขึ้นบรรทัดใหม่ / ป้อนในไฟล์ข้อความ?


18

ฉันมีไฟล์ข้อความง่ายๆชื่อ "ตัวอย่าง"

การอ่านด้วยคำสั่งเทอร์มินัล: cat example

เอาท์พุท:

abc cdef ghi jk lmnopq rst uv wxyz

ฉันต้องการแปลง (แปลง) เป็นรูปแบบต่อไปนี้: (ผลลัพธ์ที่คาดหวังจากcat example)

abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

ฉันจะทำสิ่งนี้ผ่านทางบรรทัดคำสั่งได้อย่างไร

(นี่เป็นเพียงไฟล์ตัวอย่างฉันต้องการแปลงตำแหน่งของคำในคอลัมน์แนวตั้ง)


คำตอบ:


37

ตัวเลือกน้อย:

  1. คลาสสิกใช้tr:

    tr ' ' '\n' < example
    
  2. ใช้ cut

    cut -d ' ' --output-delimiter=$'\n' -f 1- example
    
  3. ใช้ sed

    sed 's/ /\n/g' example
    
  4. ใช้ perl

    perl -pe 's/ /\n/g' example
    
  5. ใช้เปลือก

    foo=$(cat example); echo -e ${foo// /\\n}
    

สำหรับsedตัวอย่างเช่นฉันต้องการที่จะเพิ่ม$ที่จะได้รับการทุบตีเพื่อแทนที่ด้วยการขึ้นบรรทัดใหม่ที่เกิดขึ้นจริงเช่น:sed $'s/ /\\\n/g' example
acumartini

ตัวอย่างข้างต้นสำหรับ OSX sed สำหรับ gnu-sed:sed $'s/ /\\n/g'
acumartini

16

ลองคำสั่งด้านล่าง

awk -v RS=" " '{print}' file

หรือ

awk -v RS='[\n ]' '{print}' file

ตัวอย่าง:

$ awk -v RS=" " '{print}' example
abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

คำอธิบาย:

RS (Record seperator) เป็นตัวแปร awk ในตัว ในคำสั่งแรกค่าที่กำหนดให้กับตัวแปรตัวคั่นเร็กคอร์ดคือช่องว่าง ดังนั้น awk จะแยกบรรทัดออกจากการพิมพ์ทุกครั้งที่พบช่องว่าง

ในคำสั่งที่สองค่าที่กำหนดให้กับตัวแปร RS คือช่องว่างหรืออักขระบรรทัดใหม่คำสั่งนี้จะกำจัดบรรทัดว่างพิเศษที่ปรากฏขึ้นขณะที่รันคำสั่งแรก


8

คุณสามารถใช้xargs,

cat example | xargs -n 1

หรือดีกว่า

xargs -n 1 < example

6
xargs -n 1 < exampleช่วยให้คุณประหยัด 1 ลูกแมว
Rinzwind


1

ไม่มีใครโพสต์หลามดังนั้นนี่คือ:

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt 

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


0

คล้ายกับ 'tr' ด้านบน แต่เพิ่มเติมด้วย:

  • ใช้ได้กับแท็บด้วย

  • แปลงช่องว่างหรือหลายแท็บให้เป็น 1 บรรทัดใหม่

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