如果图案位于特定位置,如何删除线条

如果图案位于特定位置,如何删除线条

我在从文件中删除该行时遇到问题。我的程序将使用 while 和 if 循环检查特定条件,如果匹配,则从文件中删除该行。但是在删除时我收到类似“ sed:无法读取”的错误。我认为我已经接近解决方案,但无法解决。下面是我正在使用的代码。

#!/bin/ksh

File='dsgp_p50.dat'
cd /home/lpadmin
while read -r line
do
x=`echo "$line" | cut -c 75-104`
echo $x
if [ $x == '00000000000000+00000000000000+' ]
then
sed '1,1d' "$line" > vikas.dat
fi
done < $File

更新:

我有一个文件,其中包含以下形式的数据。

507425B30    171013D248900022   4057-ACCR PROPERTY TAX  
00000000257910+00000000000000+00000000257910+00000000000000+00000000000000+
507425B30    171013C249999092   1071-DO NOT USE         
00000000000000+00000000000000+00000000000000+00000000031940+00000000000000+

现在我必须删除包含 00000000000000+00000000000000+ 等模式的行(该模式在文件中的位置是 75-104),棘手的部分是我们必须仅在第一次出现时删除该行在同一条线上。会有像上面的第一条记录这样的情况,其中模式出现在最后,并且不应该从文件中删除该行。仅当模式 00000000000000+00000000000000+ 出现在位置 75-104 时,才应删除该行。

答案1

sed给你一些提示:

  1. while read对文件进行循环并使用sed或在内部几乎没有意义awk,因为这些工具无论如何都被设计为逐行处理文件

  2. 中的地址范围sed '1,1d'是多余的。如果您想寻址单行,则可以sed '1d'不使用范围。在这种情况下,无论如何都只有一行,那么为什么要将已删除的行重定向到文件呢?

  3. 在 中sed '1,1d' "$line"$line预计是文件名!

  4. 所以你应该做的很简单sed '/find the right regexp/d' $File

  5. 与行中位置 75ff 处的给定字符串匹配的模式将是/^.\{74\}00000000000000+00000000000000+/(即行 ( ) 的开头^,后跟 74 个随机字符和模式。

  6. 正如上面给出\{number\}的一些重复项,您可以简化为/^.\{74\}0\{14\}+0\{14\}+/

  7. 现在您可以通过对重复序列进行分组来进一步简化:\(sequence\)\{2\)

现在使用扩展正则表达式来避免反斜杠转义,您的整个脚本可以替换为一个简单的

sed -E '/^.{74}(0{14}\+){2}/d' $File

相关内容