读取文件时for循环中的值递增

时间:2016-08-05 06:35:22

标签: shell unix scripting

我的代码看起来像这样:

for line in `cat fileName`
do

 if [[ $line == "Marker 1" ]]
 then
  while [[ $line != "---" ]]
  do
   #basically I want to read all the data below "Marker 1" till "---"
   echo $line
   ((line++)) #this is wrong

  done
 elif [[ $line == "Marker 2" ]]
 then
  while [[ $line != "---" ]]
  do
   echo $line
   ((line++)) 
  done
 fi
done

在while循环中如何递增$ line的值? ((行++))不起作用

2 个答案:

答案 0 :(得分:0)

使用sed

如果目标是将带有标记1或标记2的行中的所有行回显到带有---的行,则可以使用此简单的sed命令替换整个shell循环:

sed -n '/^Marker [12]$/,/^---$/p' File

实施例

考虑这个测试文件:

$ cat File
beginning
Marker 1
one
---
more
Marker 2
two
Two
---
end

现在,让我们运行命令:

$ sed -n '/^Marker [12]$/,/^---$/p' File
Marker 1
one
---
Marker 2
two
Two
---

使用awk

使用相同的测试文件:

$ awk '/^Marker [12]$/,/^---$/' File
Marker 1
one
---
Marker 2
two
Two
---

答案 1 :(得分:0)

((line++))用于递增整数值。 但是,示例中line的值是一个字符串。

实际上你似乎想要的是从文件中获取下一行。 您需要采用不同的方法,并使用while read而不是for循环。

#!/usr/bin/env bash

read_and_print_until_dashes() {
    while read -r line; do
        [[ $line = '---' ]] && break
        echo "$line"
    done
}

while read -r line; do
    if [[ $line = "Marker 1" ]]; then
        echo "$line"
        read_and_print_until_dashes
    elif [[ $line = "Marker 2" ]]; then
        echo "$line"
        read_and_print_until_dashes
    fi
done < file.txt