使用 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
代表您的价值。
我有以下文件:
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
代表您的价值。