我有一个包含的文件
coffe
milk
water
etc..
我想使用包含milk
或milk
的变量注释掉一行,例如#milk
。
我正在尝试使用#
作为开关。
checkval="milk"
当我使用
sed 's/^.//' $file
这将删除所有行中的第一个字符。
当我使用
sed -e "s/$checkval/\#$checkval/g" $file
这可以通过添加#
来实现。
当变量包含值#milk
时,我期望以下输出文件:
coffe
milk
water
变量包含值milk
时的预期输出:
coffe
#milk
water
答案 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
替换。同样,如果#milk
为checkval
,并且文件中存在单词#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;
注意:如果您的搜索短语可以包含任何字符,请考虑使用escaping the patterns appropriately。
答案 2 :(得分:0)
感谢您的快速回复。我尝试了两种解决方案,并且都可行,但是没有达到预期。我想我有点混...我的错,对不起。 我有文件:
coffe
milk
water
,并且checkval包含milk
我想输出文件将像这样:
coffe
#milk
water
在第二种情况下 文件包含:
coffe
#milk
water
checkval:#milk
输出文件将是:
coffe
milk
water
我试图否认条件,但这不起作用。