将函数的返回值保存在文件中

时间:2018-11-15 10:27:15

标签: linux bash shell

我想从文件中删除$ 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,并且所有内容都在同一行中,这是我想避免的。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您的脚本有几个问题。

  1. 使用文件名调用sed时,不再读取stdin形式。因此,管道(|)剩下的所有内容都将被忽略,仅打印出来。
  2. 您无法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