使用 bash 脚本操作文件

Manipulating a file using bash script

我有以下文件:

RATL_EXTRAFLAGS := -DRATL_REDHAT -DRATL_VENDOR_VER=601 -DRATL_EXTRA_VER=0
LINUX_KERNEL_DIR=/lib/modules/2.6.32-279.el6.i686/build
CONFIG_MVFS=m

假设文件名为testFile 我想知道如何获取 LINUX_KERNEL_DIR 的值以及如何在需要时更改它?

另一件事,我如何检查 -DRATL_VENDOR_VER 的值是多少,以及如何在需要时更改该值?

我更愿意使用 sed 获得答案。

您可以使用这个 awk 命令:

awk -F= '=="LINUX_KERNEL_DIR"{print }' "$file"
/lib/modules/2.6.32-279.el6.i686/build

awk 命令将输入​​字段分隔符设置为 =,以便可以使用 </code> 访问 <code>= 之前的文本,使用 = 之后的值可以使用 </code>。当 <code> == "LINUX_KERNEL_DIR" 它打印 </code>.</p> <p>根据您的评论,您可以执行以下操作:</p> <pre><code>awk -F '[= ]' '{for (i=1; i<=NF; i+=2) if($i=="-DRATL_VENDOR_VER") { print $(i+1); break}} =="LINUX_KERNEL_DIR"{print }' file 601 /lib/modules/2.6.32-279.el6.i686/build

这将根据您的喜好使用 sed 生成 LINUX_KERNEL_DIR 的值:

sed -n '/LINUX_KERNEL_DIR/p' testFile | sed 's/.*=//'

此外,如果您想要 -DRATL_VENDOR_VER 的值:

sed -n '/-DRATL_VENDOR_VER/p' testFile | sed 's/.*DRATL_VENDOR_VER=\([0-9]*\).*//g'

此外,如果你想改变的值,例如LINUX_KERNEL_DIR,你可以使用这个脚本:

file=
pattern=$(sed -n '/LINUX_KERNEL_DIR/p' $file | sed 's/.*=//')
sed s,$pattern,whatever, $file

如果您想更改 DRATL_VENDOR_VER 的值,同样的过程也适用,您只需更改 pattern 变量即可。

请注意,如果变量 pattern 包含反斜杠,您需要在 sed 命令中使用不同的分隔符,在本例中我使用 ,

打印LINUX_KERNEL_DIR

中的值
sed -n '/LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=//p' testFile

这找到具有模式 LINUX_KERNEL_DIR 的行,然后删除 "LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=" 结果只有值被输出

打印DRATL_VENDOR_VER

的值
sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*//p' testFile

同时打印以上两个值

sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*//p;/LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=//p' testFile

改变值DRATL_VENDOR_VER

sed -i '/RATL_EXTRAFLAGS/s/-DRATL_VENDOR_VER=[0-9]*/-DRATL_VENDOR_VER=YOUR_VALUE_HERE/g'  testFile

其中 YOUR_VALUE_HERE 代表您的价值。