Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash脚本操作文件_Bash_Shell_Unix_Sed - Fatal编程技术网

使用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