我想从文件中删除$ temp中存储的特定行。 我的方法是 sed 删除该行,然后覆盖原始文件。 这是我正在使用的功能
cat actual.dat| cut -f2 -d ' '| sed -n "/$temp/!p" actual.dat
与 cat 一起为我返回理想的格式, 自然,我会像这样继续下去,但由于某些语法错误或idk而无法正常工作。
cat actual.dat| cut -f2 -d ' '| sed -n "/$temp/!p" actual.dat > actual.dat
如果将函数的返回值保存在变量中,则会丢失所有的 \ n -s,并且所有内容都在同一行中,这是我想避免的。
我该怎么做?
答案 0 :(得分:0)
您的脚本有几个问题。
|
)剩下的所有内容都将被忽略,仅打印出来。cat
在同一管道中将文件>
写入其中,因为>
在cat
读取内容之前先删除内容。似乎您在$temp
中有一个值必须在第二个字段(cut -f2 -d ' '
)中找到,以指示要删除的行。
一种解决方案是使用grep查找行号,然后使用sed删除该行。
linenumber=$( cat actual.dat | cut -f2 -d ' ' | grep -n -m1 "$temp" | cut -f1 -d: )
sed -i "$linenumber"'d' actual.dat
编辑:我刚刚意识到,如果找不到任何行,则上面的脚本会删除所有行
更好:
deletelines=$( cat actual.dat | cut -f2 -d ' ' | grep -n "$temp" | cut -f1 -d: | sed 's/$/d/' | tr '\n' ';')
sed -i "$deletelines" actual.dat
({deletelines
将包含10d;15d;
,以防grep
找到第10行和第15行)
相关文档为:
-n
--line-number
在输出的每一行之前,在其输入文件中添加行号。
({man grep
)
-i [SUFFIX],-in-place [= SUFFIX]
在适当位置编辑文件(如果提供扩展名,则进行备份)。默认操作模式为>,以断开符号链接和硬链接。可以使用--follow-symlinks和--copy进行更改。[...]
d
删除图案空间。开始下一个周期。
[...]
支持以下地址类型:
号码
仅匹配指定的行号。
({man sed
)