คำสั่งเพื่อแยกค่าระหว่างสองตัวแปรและเก็บไว้ในตัวแปร [ปิด]


0

ฉันพยายามแยกค่า (ตัวเลข) ระหว่างสองตัวแปรและเก็บค่าไว้ในตัวแปรอื่น

ฉันใช้คำสั่ง sed แต่ฉันไม่ได้รับผลลัพธ์ใด ๆ

#!/usr/bin/env bash
variable1=`cat $1`
variable2=`echo "$variable1" | cut -c 18`
echo "$variable2"
variable3=`echo "$variable1" | cut -c 60`
echo "$variable3"
string="${variable3}xyz${variable2}"
echo $string
line=`sed -n '/'"$string"'/,/'"$variable2"'/ p' $1`
echo $line

โปรดแนะนำวิธีแยกตัวเลขระหว่าง $ searchString และ $ variable2 ให้พูดระหว่าง$ stringซึ่งก็คือ& xyz! และ$ variable2ซึ่งก็คือ: ! ฉันมี 60 ie & xyz! 60! ดังนั้นฉันต้องสกัด 60

ฉันก็ลองด้วย

line=`sed -nr "s/$string([0-9]+),$variable2/\1/ p" $1` 

แต่เมื่อฉัน echoed $ line มันพิมพ์เนื้อหาไฟล์ทั้งหมด

ขอบคุณล่วงหน้า


5
โปรดโพสต์ตัวอย่างที่สมบูรณ์พร้อมเนื้อหาของไฟล์ มันยากที่จะเข้าใจว่าเรื่องนี้เกี่ยวกับอะไร
Tomasz

คำตอบ:


1

สิ่งนี้สามารถทำได้โดยใช้ substutition พารามิเตอร์ shell:

# setup
line='hello&xyz!60!world'
string='&xyz!'
variable2='!'

# now, remove from the beginning up to the first instance of "&xyz!"
tmp=${line#*$string}

# $tmp now holds 60!world

# remove from the end the last "!" and all following characters
result=${tmp%$variable2*}
echo $result
# => 60

ดูเหมือนว่าคำสั่ง sed ของคุณล้มเหลวเนื่องจากเครื่องหมายจุลภาค

  1. ไม่มีเครื่องหมายจุลภาคในอินพุทดังนั้นจึงไม่มีอะไรตรงกัน

    $ set -x
    $ echo "$line" | sed -nr "s/$string([0-9]+),$variable2/\1/ p"
    + sed -nr 's/&xyz!([0-9]+),!/\1/ p'
    + echo 'hello&xyz!60!world'
  2. ลบเครื่องหมายจุลภาคตอนนี้เรามีการแข่งขัน แต่คำนำหน้าและคำต่อท้ายยังคงอยู่

    $ echo "$line" | sed -nr "s/$string([0-9]+)$variable2/\1/ p"
    + sed -nr 's/&xyz!([0-9]+)!/\1/ p'
    + echo 'hello&xyz!60!world'
    hello60world
  3. ยังจับคู่ข้อความก่อนและโพสต์

    $ echo "$line" | sed -nr "s/.*$string([0-9]+)$variable2.*/\1/ p"
    + sed -nr 's/.*&xyz!([0-9]+)!.*/\1/ p'
    + echo 'hello&xyz!60!world'
    60
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.