我在从文件中删除该行时遇到问题。我的程序将使用 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
给你一些提示:
while read
对文件进行循环并使用sed
或在内部几乎没有意义awk
,因为这些工具无论如何都被设计为逐行处理文件中的地址范围
sed '1,1d'
是多余的。如果您想寻址单行,则可以sed '1d'
不使用范围。在这种情况下,无论如何都只有一行,那么为什么要将已删除的行重定向到文件呢?在 中
sed '1,1d' "$line"
,$line
预计是文件名!所以你应该做的很简单
sed '/find the right regexp/d' $File
。与行中位置 75ff 处的给定字符串匹配的模式将是
/^.\{74\}00000000000000+00000000000000+/
(即行 ( ) 的开头^
,后跟 74 个随机字符和模式。正如上面给出
\{number\}
的一些重复项,您可以简化为/^.\{74\}0\{14\}+0\{14\}+/
现在您可以通过对重复序列进行分组来进一步简化:
\(sequence\)\{2\)
现在使用扩展正则表达式来避免反斜杠转义,您的整个脚本可以替换为一个简单的
sed -E '/^.{74}(0{14}\+){2}/d' $File