如何将以下 grep 命令输出到文件?

如何将以下 grep 命令输出到文件?

我正在使用 crudini 在 ini 文件中添加和删除部分和参数。 crudini 运行后,文件中留下了多余的空行,我想要清理这些空行,以便每个部分仅由 1 个空行分隔。以下函数中的 grep 命令有效,但是当我尝试将输出重定向到文件时,结果得到一个空白文件。

代码

sctn="Section Two"
mypath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
my_ini=$mypath/test.ini
ini_sec=$sctn

function inidel () {
  crudini --del --verbose $my_ini "$ini_sec"
  grep -A1 . $my_ini | grep -v "^--$"
}

function iniadd () {
  crudini --set --verbose $my_ini "$ini_sec"
  grep -A1 . $my_ini | grep -v "^--$"
}

数据test.ini

 1| [Section One]
 2| Parameter1=x1
 3| Parameter2=example1
 4| Parameter3=one
 5|
 6| [Section Two]
 7| Parameter1=x2
 8| Parameter2=example2
 9| Parameter3=two
10|
11| [Section Three]
12| Parameter1=x3 
13| Parameter2=example3
14| Parameter3=three
15|

我尝试> $my_ini在 grep 命令之后使用。我不确定它实际上在做什么,但我的猜测是它正在为每行写入最后一个空行的结果。如果我使用>> $my_ini它,它会正确写入,但会附加文本而不是覆盖它。

答案1

双箭头 (>>) 用于将数据附加到文件,

使用单箭头 (>) 覆盖文件。

答案2

问题是我试图写入我正在操作的同一个文件。如果我使用临时文件,然后将其输出到 my_ini ,它就可以工作。

使用我的问题的原始代码,这是有效的。

function inidel () {
  crudini --del --verbose $my_ini "$ini_sec"
  grep -A1 . $my_ini | grep -v "^--$" > tmpfile
  cat tmpfile > $my_ini
}

使用 cat 这也有效。

function inidel () {
  crudini --del --verbose $my_ini "$ini_sec"
  cat $my_ini > tmpfile
  cat -s tmpfile > $my_ini
}

我确信有更好的方法可以做到这一点,但不知道更好,这就是我想出的方法和我将使用的方法。

相关内容