ฉันต้องสามารถทำได้คือแทนที่ช่องว่าง ( ) ด้วยจุด (
.
) ในสตริงในทุบตี
ฉันคิดว่ามันจะค่อนข้างง่าย แต่ฉันใหม่ดังนั้นฉันจึงไม่สามารถหาวิธีแก้ไขตัวอย่างที่คล้ายกันสำหรับการใช้งานนี้
ฉันต้องสามารถทำได้คือแทนที่ช่องว่าง ( ) ด้วยจุด (
.
) ในสตริงในทุบตี
ฉันคิดว่ามันจะค่อนข้างง่าย แต่ฉันใหม่ดังนั้นฉันจึงไม่สามารถหาวิธีแก้ไขตัวอย่างที่คล้ายกันสำหรับการใช้งานนี้
คำตอบ:
ใช้การแทนที่สตริง inline shell ตัวอย่าง:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
ดูhttp://tldp.org/LDP/abs/html/string-manipulation.htmlสำหรับรายละเอียดเพิ่มเติม
tr
... !
$'\n'
คุณสามารถใช้tr
แบบนี้:
tr " " .
ตัวอย่าง:
# echo "hello world" | tr " " .
hello.world
จากman tr
:
DESCRIPTION
แปลบีบและ / หรือลบตัวอักษรจากอินพุตมาตรฐานเขียนไปยังเอาต์พุตมาตรฐาน
ใน bash คุณสามารถทำการแทนที่รูปแบบในสตริงด้วยการ${VARIABLE//PATTERN/REPLACEMENT}
สร้าง ใช้เพียง/
และไม่//
แทนที่เฉพาะเหตุการณ์แรกเท่านั้น รูปแบบเป็นรูปแบบสัญลักษณ์แทนเช่นไฟล์คลำ
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
ลองสิ่งนี้
echo "hello world" | sed 's/ /./g'
ใช้การทดแทนพารามิเตอร์:
string=${string// /.}
ลองใช้เส้นทางนี้:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
มันจะแทนที่ช่องว่างภายในสตริงที่มีเครื่องหมายคำพูดคู่+
และแทนที่ด้วย+
เครื่องหมายคำพูดคู่เครื่องหมายด้วยแบ็กสแลชจากนั้นลบ / แทนที่เครื่องหมายคำพูดคู่
ฉันต้องใช้สิ่งนี้เพื่อแทนที่ช่องว่างในหนึ่งในเส้นทางของฉันใน Cygwin
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
ได้แล้ว คำพูดไม่เกี่ยวข้อง
tr
สำหรับสตริงยาว ในระบบของฉันมีtr
ประสิทธิภาพดีกว่าทุบตีเริ่มต้นที่สตริงที่มีมากกว่า1000
ตัวอักษร ดูเหมือนว่าความซับซ้อนของเวลาของ bash นั้นแย่กว่าเชิงเส้นx="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
การทดสอบขนาดเล็ก: ที่มีความยาวสตริงของ 1M (= 2 ^ 20)tr
เข้ามา0.04s
และทุบตี 5.0.1117s
เอา ด้วย 2Mtr
ใช้เวลา0.07s
(คาดว่า) แต่ทุบตีใช้เวลา69s
(4 ครั้งนานเป็นสองเท่าของความยาวสตริง)