我正在使用sed
包含文件路径、正则表达式回调和算术表达式的变量来获得正确的语法。我不知道如何正确逃避事情。
我在文本文件中有一个文件路径,旁边有一个数字。我想找到这一行并增加数字。
FILE="/home/username/scripts/test.txt"
LINE="/home/username/Pictures/properties/wallpaper/span/tree.jpg"
sed -i -e "s,'$LINE' \([0-9]*\),'$LINE' $((\1+1))," $FILE
例如..
/home/username/Pictures/properties/wallpaper/span/tree.jpg 2
应该变成..
/home/username/Pictures/properties/wallpaper/span/tree.jpg 3
逃避“。”的最好方法是什么?在文件路径中?如何正确实现\1
回调和算术表达式$((\1+1)
?
目前我遇到了错误的令牌\1+1
错误。
sed
和算术不能混用。适合此类工作的工具是awk
.考虑这个测试文件:
我们可以增加您想要的行号:
如您所见,这增加了匹配行上的数字
$line
。一个限制是,编写的此代码不会在数字增加的行上保留多个空白。如果空格很重要,我们需要对输入格式进行更多定义。
这个怎么运作
-v f="$line"
这会将 shell 变量的值分配给
line
awk 变量f
。$0~f {$NF++}
这里,
$0~f
是一个条件。如果输入行(表示为)与上面定义$0
的正则表达式匹配,则为真。f
如果匹配,则$NF++
执行该语句。这会增加行上的最后一个字段,对于您的输入,该字段是数字。1
这是 awk 对 print-the-line 的神秘简写。
就地编辑文件
awk
如果你有一个现代的 GNU awk,你可以编辑文件:
与其他 awks 一起使用:
text.txt
如果不存在则创建在文件
test.txt
不包含匹配行的情况下$line
,此版本将这样一行1
作为计数:此代码添加了一个变量
n
。如果$line
在文件中,n
则设置为1
. 如果不是,则n
保持默认值0
. 在END
输入文件的 处,n
测试 的值。如果n
仍然为零,则添加该行。