ถ้าฉันรันคำสั่งcat file | grep pattern
ฉันจะได้ผลลัพธ์หลายบรรทัด คุณต่อแถวทั้งหมดเป็นหนึ่งบรรทัดได้อย่างไรโดยแทนที่แต่ละบรรทัด"\n"
ด้วย"\" "
(ลงท้ายด้วย"
ช่องว่าง)
cat file | grep pattern | xargs sed s/\n/ /g
ไม่ทำงานสำหรับฉัน
ถ้าฉันรันคำสั่งcat file | grep pattern
ฉันจะได้ผลลัพธ์หลายบรรทัด คุณต่อแถวทั้งหมดเป็นหนึ่งบรรทัดได้อย่างไรโดยแทนที่แต่ละบรรทัด"\n"
ด้วย"\" "
(ลงท้ายด้วย"
ช่องว่าง)
cat file | grep pattern | xargs sed s/\n/ /g
ไม่ทำงานสำหรับฉัน
คำตอบ:
ใช้tr '\n' ' '
เพื่อแปลอักขระบรรทัดใหม่ทั้งหมดเป็นช่องว่าง:
$ grep pattern file | tr '\n' ' '
หมายเหตุ: grep
อ่านไฟล์cat
เชื่อมไฟล์ต่าง ๆ อย่าcat file | grep
!
แก้ไข:
tr
สามารถจัดการการแปลตัวอักษรเดียวเท่านั้น คุณสามารถใช้awk
เพื่อเปลี่ยนตัวแยกบันทึกผลลัพธ์เช่น:
$ grep pattern file | awk '{print}' ORS='" '
สิ่งนี้จะเปลี่ยน:
one
two
three
ถึง:
one" two" three"
echo ""
ในตอนท้ายเพื่อเพิ่มบรรทัดใหม่ก่อนที่จะมีข้อความแจ้ง
"
แสดงขึ้นมาเหมือนone" two" three"
กัน แต่ฉันต้องการให้ปรากฏเหมือนone" two" three
กัน หมายเหตุสามอันสุดท้ายไม่มีวงเล็บ ความคิดใด ๆ
sed '$s/..$//'
ลบอักขระ 2 ตัวสุดท้ายในบรรทัดสุดท้าย
--delete
ตัวเลือกตามค่าเริ่มต้นที่คาดว่าจะมีสองอาร์กิวเมนต์ tr --delete '\n'
เช่น
ไปป์xargs
ไลน์เพื่อเชื่อมต่อแต่ละบรรทัดของเอาต์พุตกับบรรทัดเดียวโดยมีช่องว่าง:
grep pattern file | xargs
หรือคำสั่งใด ๆ เช่น ls | xargs
. ขีด จำกัด ดีฟอลต์ของxargs
เอาต์พุตคือ ~ 4096 ตัวอักษร แต่สามารถเพิ่มได้เช่น xargs -s 8192
.
| tr '\n' ' '
ไม่ทำงานสำหรับฉันเมื่อถูกเรียกผ่านphp exec
ฟังก์ชั่น มันไม่สนใจ tr และเพิ่งให้นัดสุดท้ายจาก grep | xargs
ทำงาน
ใน bash ที่echo
ไม่มีเครื่องหมายคำพูดให้นำ carriage return, tab และหลายช่องว่าง
echo $(cat file)
IFS="$(printf '\n\t')"
echo $(<file)
... การใช้เสียงสะท้อนไม่ได้เป็นเพียงเสียงมากกว่าการใช้tr '\n' ' '
แต่ยังดีกว่า (คิดว่าการ\r\n
จบบรรทัด) @aggsol คุณสามารถพูดได้IFS=$'\n\t'
นี่อาจเป็นสิ่งที่คุณต้องการ
cat file | grep pattern | paste -sd' '
สำหรับการแก้ไขของคุณฉันไม่แน่ใจว่ามันแปลว่าอะไร
cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'
(สิ่งนี้ถือว่า~
ไม่มีในfile
)
cat file
จะเป็นจริงcat
หรือแม้แต่ไฟล์ (ฉันเหลือเพียงส่วนหนึ่งที่ไม่เปลี่ยนแปลงเพราะมันเป็นอะไรที่ไม่เกี่ยวข้องกับคำถาม)
นี่คือตัวอย่างที่สร้างเอาต์พุตแยกจากคอมมา คุณสามารถแทนที่เครื่องหมายจุลภาคด้วยตัวคั่นที่คุณต้องการ
cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD
ผลิต:
1,2,3,4,5
นี่คือวิธีการใช้ex
โปรแกรมแก้ไข (ส่วนหนึ่งของVim ):
J oin ทุกบรรทัดและp rint ไปยังเอาต์พุตมาตรฐาน:
$ ex +%j +%p -scq! file
J oin ทุกบรรทัดในสถานที่ (ในไฟล์):
$ ex +%j -scwq file
หมายเหตุ: สิ่งนี้จะเชื่อมโยงทุกบรรทัดภายในไฟล์ด้วยตนเอง!
เมื่อเราต้องการแทนที่อักขระบรรทัดใหม่ \n
ด้วยช่องว่าง :
xargs < file
xargs
มีข้อ จำกัด เกี่ยวกับจำนวนอักขระต่อบรรทัดและจำนวนอักขระทั้งหมดรวมกัน แต่เราสามารถเพิ่มได้ รายละเอียดสามารถพบได้โดยใช้คำสั่งนี้: xargs --show-limits
และแน่นอนในคู่มือ:man xargs
เมื่อเราต้องการแทนที่ตัวละครหนึ่งด้วยอีกตัวหนึ่งตัว :
tr '\n' ' ' < file
เมื่อเราต้องการแทนที่หนึ่งอักขระด้วยอักขระหลายตัว :
tr '\n' '~' < file | sed s/~/many_characters/g
อันดับแรกเราแทนที่อักขระบรรทัดใหม่\n
สำหรับตัวหนอน~
(หรือเลือกอักขระที่ไม่ซ้ำกันอีกตัวหนึ่งซึ่งไม่ปรากฏในข้อความ) จากนั้นเราจะแทนที่อักขระตัวหนอนด้วยอักขระอื่น ๆ ( many_characters
) และเราดำเนินการแทนตัวหนอน (ธงg
)
อาจเป็นวิธีที่ดีที่สุดในการใช้เครื่องมือ 'awk' ซึ่งจะสร้างผลลัพธ์เป็นหนึ่งบรรทัด
$ awk ' /pattern/ {print}' ORS=' ' /path/to/file
มันจะรวมทุกบรรทัดเป็นหนึ่งเดียวด้วยตัวคั่นช่องว่าง
{print}
เนื่องจากเป็นการกระทำเริ่มต้นของ awk
นี่เป็นอีกวิธีการง่ายๆที่ใช้awk
:
# cat > file.txt
a
b
c
# cat file.txt | awk '{ printf("%s ", $0) }'
a b c
นอกจากนี้หากไฟล์ของคุณมีคอลัมน์สิ่งนี้จะช่วยให้เชื่อมโยงคอลัมน์บางคอลัมน์ได้ง่าย:
# cat > cols.txt
a b c
d e f
# cat cols.txt | awk '{ printf("%s ", $2) }'
b e
บน linux hat สีแดงฉันแค่ใช้ echo:
echo $ (cat / some / file / name)
นี่ให้เรคคอร์ดทั้งหมดของไฟล์ในบรรทัดเดียว
sed
สคริปต์ของคุณในเครื่องหมายคำพูดเดียวเพื่อให้ Bash ไม่ยุ่งกับมัน (ตั้งแต่การsed s/\n/ /g
โทรที่sed
มีสองอาร์กิวเมนต์คือs/n/
และ/g
); (2) ตั้งแต่คุณต้องการผลลัพธ์ของcat file | grep pattern
การเป็นผู้ป้อนข้อมูลไปยังsed
ไม่ได้ข้อโต้แย้งที่จะsed
คุณจะต้องกำจัดxargs
; และ (3) ไม่จำเป็นสำหรับcat
ที่นี่เนื่องจากgrep
สามารถใช้ชื่อไฟล์เป็นอาร์กิวเมนต์ที่สองgrep pattern file | sed 's/\n/ /g'
ดังนั้นคุณควรมีความพยายาม (ในกรณีนี้มันจะไม่ทำงานด้วยเหตุผลที่ได้รับจากลิงก์ด้านบน แต่ตอนนี้คุณรู้อนาคตแล้ว)