我想逐行读取文件并并行删除那些行。 为此,我编写了此脚本。
#!/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"
这是正确的方法吗?
答案 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行。但是:即使lineno
是42
,您也已经在之前的迭代中删除了这些行。因此,您始终只需要删除第一行。
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"
最后的笔记:
< "$fielpos"
将锁定文件,因此sed
无法写入文件。 Unix / Linux仍然可以。