0

我有一个具有这种结构的文本文件:

....

"/home/letizia/Documents/SpanishSegmentation/Recordings/segmented/mfc/F001.0.rec"
COGE
LAS
HOJAS
Y
LAS
QUEMAS
TODAS
EN
EL
FUEGO
"/home/letizia/Documents/SpanishSegmentation/Recordings/segmented/mfc/F002.0.rec"
LA
LIGA
DE
PAZ
SE
REUNIO314201
PARA
TRATAR
EL
TEMA
....

我想选择“F0001.0”和“F0002.0”。

我在用:

     ID="F"
     if [[ "$LINE" == *Recordings* ]]
     then        
     SEGMENT=`echo $LINE | grep -o $ID.* | cut -d'.' -f1-2`
     fi

但它不起作用。错误在哪里?

非常感谢您提前。

4

2 回答 2

2

尝试sed改用:

sed -n 's@^".*/Recordings/.*/\(.*\)"$@\1@p' file.txt

快速演练:

  1. -np: 除非特别要求(最后),否则不要打印任何内容。
  2. s@: 将直到下一个@的部分替换为直到下一个的部分。
  3. ^".*/Recordings/.*/\(.*\)"$:匹配以双引号开始和结束的行,包含/Recordings/,并吃掉所有内容,直到最后一个斜杠。
  4. \1:用最后一部分替换匹配的字符串(我们在括号中捕获)。
于 2013-02-18T11:48:10.737 回答
1

你需要一个while循环:

while IFS= read -r line; do
    id="F"
    if [[ "$line" =~ /Recordings/ ]]; then

        segment=$(echo $line | grep -o "$id.*" | cut -d '.' -f1-2)
        echo "$segment"
    fi
done < file.txt

结果:

F001.0
F002.0

但是,更好的方法是使用sed

sed -n '/Recordings/s#.*/\(F[^\.]*\.[^\.]*\).*#\1#p' file.txt
于 2013-02-18T12:37:19.350 回答