我想在文件中找到修订号 - 将从用户输入新的修订号,而新的修订号将替换旧的修订号。 例如:
revision: 56
如果用户输入为67,则应将替换为67,如下所示;
revision: 67
我想要一个bash脚本,它会找到旧的数字并用新的数字替换旧数字。新修订号的值将存储在变量revision_number中。
到目前为止,这是我得到的:
#!/bin/bash
echo “Insert the new revision number: “
read revision_number
sed -e ^revision: \d+$/^revision: $revision_number$ *.txt
答案 0 :(得分:2)
像这样:
sed "s/^revision:.*/revision: ${input}/" file
答案 1 :(得分:2)
要使用sed更改文件,请使用:
sed -i -E "s/^revision: [[:digit:]]+$/revision: $revision_number/" *.txt
备注:强>
sed支持POSIX正则表达式。 \d
不是POSIX。 [[:digit:]]
是POSIX,优于[0-9]
,因为它是unicode安全的。
+
。使用-E
获取扩展的正则表达式。
-i
告诉sed更改文件。
请注意,sed不会将$revision_number
视为数据,而是将其视为命令的一部分。 这很危险。 $revision_number
的恶意值可能导致文件被删除或覆盖。
兼容性:以上适用于现代GNU sed。对于非常旧的GNU sed,请将-E
替换为-r
:
sed -i -r "s/^revision: [[:digit:]]+$/revision: $revision_number/" *.txt
对于BSD / OSX sed,将-i
替换为-i ''
:
sed -i '' -E "s/^revision: [[:digit:]]+$/revision: $revision_number/" *.txt
使用GNU awk就地更改文件:
gawk -i inplace -v r="$revision_number" '{sub(/^revision: [[:digit:]]+/, "revision: " r)} 1' *.txt
备注:强>
BSD / OSX awk不支持-i inplace
。
由于awk将$revision_number
视为数据而不是代码,因此使用它比使用sed方法更安全。
答案 2 :(得分:1)
perl的
perl -i -spe 's/^revision:\s+\K\d+/$revno/g' -- -revno="$revision_number" *.txt