我想从文件中删除$ temp中存储的特定行。
我这样做的方法是排成一行,然后覆盖原始文件。
这是我正在使用的功能
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,并且所有内容都将在同一行中,这是我想避免的。
我该怎么做呢?
最佳答案
您的脚本有几个问题。
用文件名调用sed时,它不再读取stdin形式。因此,管道的所有剩余内容(|
)都将被忽略并仅打印出来。
您不能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
找到第10行和第15行,则10d;15d;
将包含grep
)相关文档为:
-n
- 电话号码
在输出的每一行之前在其输入文件中添加行号作为前缀。
(
man grep
)-i [SUFFIX],-in-place [= SUFFIX]
在适当位置编辑文件(如果提供扩展名,则进行备份)。默认操作模式为>,以断开符号链接和硬链接。可以使用--follow-symlinks和--copy进行更改。
[...]
d
删除图案空间。开始下一个周期。
[...]
支持以下地址类型:
数
仅匹配指定的行号。
(
man sed
)
关于linux - 将函数的返回值保存在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53317319/