使用bash脚本操作文件
我有以下文件:使用bash脚本操作文件,bash,shell,unix,sed,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\u KERNEL\u DIR的值,以及如何在需要时更改它 还有一件事,我如何检查-DRATL\u VENDOR\u VER的值是多少,以
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\u KERNEL\u DIR
的值,以及如何在需要时更改它
还有一件事,我如何检查-DRATL\u VENDOR\u VER
的值是多少,以及在需要时如何更改值
我更喜欢使用
sed
获得答案。您可以使用以下awk命令:
awk -F= '$1=="LINUX_KERNEL_DIR"{print $2}' "$file"
/lib/modules/2.6.32-279.el6.i686/build
此awk
命令将输入字段分隔符设置为=
,以便可以使用$1
访问=
之前的文本,使用$2
访问=
之后的值。当$1==“LINUX\u KERNEL\u DIR”
时,它会打印$2
根据您的意见,您可以:
awk -F '[= ]' '{for (i=1; i<=NF; i+=2) if($i=="-DRATL_VENDOR_VER") { print $(i+1); break}}
$1=="LINUX_KERNEL_DIR"{print $2}' file
601
/lib/modules/2.6.32-279.el6.i686/build
awk-F'[=]'{for(i=1;i这将产生LINUX\u KERNEL\u DIR
的值,使用您喜欢的sed:
sed -n '/LINUX_KERNEL_DIR/p' testFile | sed 's/.*=//'
此外,如果需要-DRATL\u VENDOR\u VER
的值:
sed -n '/-DRATL_VENDOR_VER/p' testFile | sed 's/.*DRATL_VENDOR_VER=\([0-9]*\).*/\1/g'
此外,如果要更改的值,例如,LINUX\u KERNEL\u DIR
,可以使用以下脚本:
file=$1
pattern=$(sed -n '/LINUX_KERNEL_DIR/p' $file | sed 's/.*=//')
sed s,$pattern,whatever, $file
如果要更改DRATL\u VENDOR\u VER
的值,则相同的过程也适用,只需更改模式
变量即可
请注意,如果变量模式包含反斜杠,则需要在sed命令中使用不同的分隔符,在本例中,我使用,
在LINUX\u KERNEL\u DIR
中打印值
sed -n '/LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=//p' testFile
sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*/\1/p' testFile
sed -i '/RATL_EXTRAFLAGS/s/-DRATL_VENDOR_VER=[0-9]*/-DRATL_VENDOR_VER=YOUR_VALUE_HERE/g' testFile
这将查找具有模式LINUX\u KERNEL\u DIR
的行,然后删除“LINUX\u KERNEL\u DIR/s/LINUX\u KERNEL\u DIR=“
”,结果只输出值
打印DRATL\u供应商版本的值
sed -n '/LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=//p' testFile
sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*/\1/p' testFile
sed -i '/RATL_EXTRAFLAGS/s/-DRATL_VENDOR_VER=[0-9]*/-DRATL_VENDOR_VER=YOUR_VALUE_HERE/g' testFile
同时打印上述两个值
sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*/\1/p;/LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=//p' testFile
更改供应商版本的值DRATL\u
sed -n '/LINUX_KERNEL_DIR/s/LINUX_KERNEL_DIR=//p' testFile
sed -n '/RATL_EXTRAFLAGS/s/.*-DRATL_VENDOR_VER=\([0-9]*\).*/\1/p' testFile
sed -i '/RATL_EXTRAFLAGS/s/-DRATL_VENDOR_VER=[0-9]*/-DRATL_VENDOR_VER=YOUR_VALUE_HERE/g' testFile
其中您的值\u此处
代表您的值。您自己尝试过什么吗?查找有关sed
的相关问题?堆栈溢出不是要求人们编写代码的地方…是的,我尝试过使用awk
但它没有真正起作用。我知道如何获取行号,然后回复string但我不能确定这个文件的结构是否相同,我的意思是行号将与您所做的任何尝试相同;它表明您至少已经为解决方案做出了努力,并且您不仅仅是在等待某人为您工作。如果“它没有真正起作用”,解释到底是什么不起作用。您写道“无法确定此文件的结构是否相同”但是,如果你想得到一个明确的答案,你需要非常清楚这个文件的一般结构是什么。我已经尝试过这样的东西sed-n'/LINUX\u KERNEL\u DIR=*/p'$file
,但是它没有打印LINUX\u KERNEL\u DIR
的值呢DRATL\u VENDOR\u VER
,我怎么打印它呢?sed不是t设计用于提取值,最好使用awk或grep