用perl编辑文本文件

时间:2010-02-03 00:32:02

标签: perl unix sed awk grep

我正在尝试编辑一个如下所示的文本文件:

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的文本处理语言有点新意,所以请耐心等待......

谢谢!

3 个答案:

答案 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一样,但会将文件放回原来的位置。