逐行读取文件并删除该行

时间:2018-10-10 11:11:02

标签: bash shell

我想逐行读取文件并并行删除那些行。 为此,我编写了此脚本。

#!/bin/bash
fielpos="/Desktop/Folder/fiel.txt"
LineNoCtr=0
while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "Text read from file: $line"
        LineNoCtr=expr $LineNoCtr + 1
        echo "line no is:$LineNoCtr"
        sed -i "/$LineNoCtr/"'d' $fielpos
        sleep 1
done < "$fielpos"

这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

让我们散步:

#!/bin/bash
fielpos="/Desktop/Folder/fiel.txt"

在此处使用declare -i lineno=0:a)通常的命名约定,b)将其声明为整数变量而不是文本变量

LineNoCtr=0

IFS=''在这里不是必需的,[[ -n "$line" ]]也是不必要的,因为它将终止空行的循环。

while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "Text read from file: $line"

根据let ++lineno行更改为declare -i

        LineNoCtr=expr $LineNoCtr + 1

$LineNoCtr更改为$lineno

        echo "line no is:$LineNoCtr"

更改为sed -i "1 d" "$fielpos"是因为

  • 您在下面使用"$fielpos",这意味着您可能希望文件名中包含空格。
  • sed "/42/d"将删除包含文本42的行,而sed "42d"删除第42行。但是:即使lineno42,您也已经在之前的迭代中删除了这些行。因此,您始终只需要删除第一行。

        sed -i "/$LineNoCtr/"'d' $fielpos
        sleep 1
    

    完成<“ $ fielpos”

将各个部分放在一起:

#!/bin/bash
fielpos="y"
declare -i lineno=0
while read -r line; do
        echo "Text read from file: $line"
        let ++lineno
        echo "line no is:$lineno"
        sed -i "1 d" "$fielpos"
        sleep 1
done < "$fielpos"

最后的笔记:

  • 如果文件很大,则此方法非常慢,因为每次迭代都将写入几乎所有文件。
  • 这在Windows上不起作用,因为< "$fielpos"将锁定文件,因此sed无法写入文件。 Unix / Linux仍然可以。