使用bash脚本操作文件

时间:2015-01-05 18:10:43

标签: bash shell unix sed

我有以下文件:

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获得答案。

3 个答案:

答案 0 :(得分:2)

您可以使用此awk命令:

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

awk命令将输入​​字段分隔符设置为=,以便可以使用=访问$1之前的文本,使用{{1} =之后的值}}。当$2打印$1 == "LINUX_KERNEL_DIR"时。

根据您的评论,您可以这样做:

$2

答案 1 :(得分:2)

根据您的喜好,这将使用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]*\).*/\1/g'

此外,如果您想更改LINUX_KERNEL_DIR的值,可以使用此脚本:

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

如果您想要更改DRATL_VENDOR_VER的值,则同样的步骤有效,您需要更改的是pattern变量。

请注意,如果变量pattern包含反斜杠,则需要在sed命令中使用不同的分隔符,在这种情况下我使用,

答案 2 :(得分:2)

要在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]*\).*/\1/p' testFile

同时打印上述两个值

sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*/\1/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代表您的价值。