我正在尝试编辑一个如下所示的文本文件:
TYPE=Ethernet
HWADDR=00:....
IPV6INIT=no
MTU=1500
IPADDR=192.168.2.247
...
(它实际上是red hat Linux上的/ etc / sysconfig / network-scripts / ifcfg-文件) 每次我想修改它时,我都没有读取和重写文件,而是认为我可以使用grel,sed,awk或Perl中提供的本机文本解析功能。
例如,如果我想更改文件的IPADDR字段,有没有办法直接检索和修改该行?也许像是
grep 'IPADDR=' <filename>
但添加一些额外的参数来修改该行?我对基于UNIX的文本处理语言有点新意,所以请耐心等待......
谢谢!
答案 0 :(得分:8)
这是一个用IP地址127.0.01替换IPADDR值的Perl oneliner。它足够短,您应该能够看到需要修改的内容以改变其他字段*:
perl -p -i.orig -e 's/^IPADDR=.*$/IPADDR=127.0.0.1/' filename
它会将“filename”重命名为“filename.orig”,并将该文件的新版本写入“filename”。
Perl命令行选项在perldoc perlrun解释(感谢提醒工具!),perl正则表达式的语法位于perldoc perlre。
* 正则表达式^IPADDR=.*$
,拆分为组件,表示:
^ # bind to the beginning of the line
IPADDR= # plain text: match "IPADDR="
.* # followed by any number of any character (`.` means "any one character"; `*` means "any number of them")
$ # bind to the end of the line
答案 1 :(得分:2)
因为您使用的是redhat,所以可以尝试使用shell
#!/bin/bash
file="file"
read -p "Enter field to change: " field
read -p "Enter new value: " newvalue
shopt -s nocasematch
while IFS="=" read -r f v
do
case "$f" in
$field)
v=$newvalue;;
esac
echo "$f=$v"
done <$file > temp
mv temp file
更新:
file="file"
read -p "Enter field to change: " field
read -p "Enter new value: " newvalue
shopt -s nocasematch
EOL=false
IFS="="
until $EOL
do
read -r f v || EOL=true
case "$f" in
$field)
v=$newvalue;;
esac
echo "$f=$v"
done <$file #> temp
#mv temp file
或者,只使用awk
awk 'BEGIN{
printf "Enter field to change: "
getline field < "-"
printf "Enter new value: "
getline newvalue <"-"
IGNORECASE=1
OFS=FS="="
}
field == $1{
$2=newvalue
}
{
print $0 > "temp"
}END{
cmd="mv temp "FILENAME
system(cmd)
}' file
或使用Perl
printf "Enter field: ";
chomp($field=<STDIN>);
printf "Enter new value: ";
chomp($newvalue=<STDIN>);
while (<>){
my ( $f , $v ) = split /=/;
if ( $field =~ /^$f/i){
$v=$newvalue;
}
print join("=",$f,$v);
}
答案 2 :(得分:0)
那就是'ed'命令行编辑器,就像sed一样,但会将文件放回原来的位置。