使用bash注释或取消注释特定行

时间:2019-08-13 12:51:17

标签: bash sed

我有一个包含的文件

coffe
milk
water
etc..

我想使用包含milkmilk的变量注释掉一行,例如#milk

我正在尝试使用#作为开关。

checkval="milk"

当我使用

sed 's/^.//' $file

这将删除所有行中的第一个字符。

当我使用

sed -e "s/$checkval/\#$checkval/g" $file

这可以通过添加#来实现。

当变量包含值#milk时,我期望以下输出文件:

coffe
milk
water

变量包含值milk时的预期输出:

coffe
#milk
water

3 个答案:

答案 0 :(得分:0)

下面的脚本将执行所需的任务。

1 , 2

如果checkval="#milk" initial="$(echo $checkval | head -c 1)" if [ "$initial" = "#" ] then new_checkval="${checkval:1}" sed -e 's_'$checkval'_'$new_checkval'_g' input.txt else sed -e 's_'$checkval'_#&_g' input.txt fi checkval并且文件中存在单词milk,则它将被milk替换。同样,如果#milkcheckval,并且文件中存在单词#milk,则它将替换为#milk

答案 1 :(得分:0)

您可以使用if条件来检查checkval是否以#字符开头并实现不同的逻辑:

  • 如果checkval#开头,则需要按原样在LHS中使用sed运行checkval命令,并使用${checkval:1}( RHS中的checkval(不带首字符)
  • 否则,您需要搜索checkval并将其替换为#和找到的文本。

考虑使用

checkval="milk";
if [[ $checkval != \#* ]]; then
  sed "s/$checkval/#&/" file > newfile
else
  sed "s/$checkval/${checkval:1}/" file > newfile
fi;

请参见this demothis demo, too

注意:如果您的搜索短语可以包含任何字符,请考虑使用escaping the patterns appropriately

答案 2 :(得分:0)

感谢您的快速回复。我尝试了两种解决方案,并且都可行,但是没有达到预期。我想我有点混...我的错,对不起。 我有文件:

coffe
milk
water

,并且checkval包含milk 我想输出文件将像这样:

coffe
#milk
water

在第二种情况下 文件包含:

coffe
#milk
water

checkval:#milk 输出文件将是:

coffe
milk
water

我试图否认条件,但这不起作用。