grep和替换

时间:2013-03-05 21:20:50

标签: perl sed grep

我想在第一次出现时从文件(file.dat)grep一个字符串,并通过从另一个文件(输出)读取来替换它。我有一个名为“output”的文件,例如包含“AAA T 0001

#!/bin/bash
procdir=`pwd`

cat output | while read lin1 lin2 lin3
do
  srt2=$(echo $lin1 $lin2 $lin3 | awk '{print $1,$2,$3}')
  grep -m 1 $lin1  $procdir/file.dat | xargs -r0 perl -pi -e 's/$lin1/$srt2/g'
done

基本上我想要的是:当第一个实例中的文件“file.dat”中有一个字符串“AAA”时,我想用“T”替换“AAA”旁边的第二和第三列0001“但仍保留第一列”AAA“。上面的脚本基本上不起作用。基本上“$ lin1”和$ srt2变量在's / $ lin1 / $ srt2 / g'中无法理解

示例:

在我的file.dat中有一行

AAA D ---- CITY COUNTRY

我想要的是:

AAA T 0001 CITY COUNTRY

非常感谢任何评论。

3 个答案:

答案 0 :(得分:1)

如果您有输出文件,请执行以下操作:

$ cat output
AAA T 0001

您的 file.dat 文件包含以下信息:

$ cat file.dat
AAA D ---- CITY COUNTRY
BBB C ---- CITY COUNTRY
AAA D ---- CITY COUNTRY

您可以使用awk尝试类似的内容:

$ awk '
NR==FNR { 
    a[$1]=$0
    next
} 
$1 in a {
    printf "%s ", a[$1]
    delete a[$1]
        for (i=4;i<=NF;i++) { 
            printf "%s ", $i 
        }
    print ""
    next
}1' output file.dat
AAA T 0001 CITY COUNTRY
BBB C ---- CITY COUNTRY
AAA D ---- CITY COUNTRY

答案 1 :(得分:0)

假设您要在$s中放置要搜索的字符串,并在$r中放置要替换的字符串,以下操作不会吗?

perl -i -pe'
   BEGIN { ($s,$r)=splice(@ARGV,0,2) }
   $done ||= s/\Q$s/$r/;
' "$s" "$r" file.dat

(替换第一个实例,如果存在)

答案 2 :(得分:0)

这只会更改文件中的第一个匹配项:

#!/bin/bash
procdir=`pwd`
while read line; do
    set $line
    sed '0,/'"$1"'/s/\([^ ]* \)\([^ ]* [^ ]*\)/\1'"$2 $3"'/' $procdir/file.dat
done < output

要更改所有匹配的行:

sed '/'"$1"'/s/\([^ ]* \)\([^ ]* [^ ]*\)/\1'"$2 $3"'/' $procdir/file.dat