簡體   English   中英

使用Perl命令行進行搜索和替換時遇到問題

[英]Having trouble using perl command line to do a search and replace

我在Mac YOsemite上使用bash shell。 我有一個包含以下行的文件

560c4f458b97330d00b0832d 5237d5eee1399d2f11005571
560c4f458b97330d00b0832e 55c4a0001b9e2d0e00032d6f
560c4f458b97330d00b0832f 55ce2e78e1055a0d008cad3c
560c4f458b97330d00b08330 55ce2e78e1055a0d008cad44
560c4f458b97330d00b08331 55ce2e78e1055a0d008cad4a
560c4f458b97330d00b08332 55c4a0001b9e2d0e00032d78
560c4f458b97330d00b08333 55c4a0001b9e2d0e00032d7b
560c4f458b97330d00b08334 55ce2e78e1055a0d008cad51

我正在嘗試編寫一個表達式,將文件轉換為一系列SQL語句。 所以我嘗試了

perl -pi -e “s/(.*?)\s(.*)/update my_sql_table set my_user_id = '$2' where my_user_id = '$1';/g" /tmp/myfile.csv

希望得到一個文件行line

update my_sql_table set my_user_id = '5237d5eee1399d2f11005571' where my_user_id = '560c4f458b97330d00b0832d';
update my_sql_table set my_user_id = '55c4a0001b9e2d0e00032d6f' where my_user_id = '560c4f458b97330d00b0832e';

但是相反,輸出是看起來像這樣的大量語句

update my_sql_table set my_user_id = '' where my_user_id = '';update my_sql_table set my_user_id = '' where my_user_id = '';update my_sql_table set my_user_id = '' where my_user_id = '';update my_sql_table set my_user_id = ''

我該如何糾正我的上述聲明以將令牌放置在正確的位置?

我會在perl循環中使用split而不是正則表達式:

use strict;
use warnings;

open my $input_file, '<', 'input.txt' or die $!;

while(<$input_file>){   
        chomp;
        my @fields = split;
        print "update my_sql_table set my_user_id = $fields[1] where my_user_id = $fields[0]\n";
    }

還是單線:

perl -F: -lane 'print "update my_sql_table set my_user_id = $F[1] where my_user_id = $F[0]";' in.txt

或使用awk:

awk '{ print "update my_sql_table set my_user_id = " $2 "where my_user_id = " $1 }' < in.txt 

一個簡短的shell循環(為了執行此操作,似乎不太適合使用Perl):

while read -r old new; do
    cat <<SQL_END
UPDATE my_sql_table
    SET my_user_id   = '$new'
    WHERE my_user_id = '$old';
SQL_END
done

使用data.in提供的數據運行它:

$ sh scripts.sh <data.in
UPDATE my_sql_table
    SET my_user_id   = '5237d5eee1399d2f11005571'
    WHERE my_user_id = '560c4f458b97330d00b0832d';
UPDATE my_sql_table
    SET my_user_id   = '55c4a0001b9e2d0e00032d6f'
    WHERE my_user_id = '560c4f458b97330d00b0832e';
UPDATE my_sql_table
    SET my_user_id   = '55ce2e78e1055a0d008cad3c'
    WHERE my_user_id = '560c4f458b97330d00b0832f';
UPDATE my_sql_table
    SET my_user_id   = '55ce2e78e1055a0d008cad44'
    WHERE my_user_id = '560c4f458b97330d00b08330';
UPDATE my_sql_table
    SET my_user_id   = '55ce2e78e1055a0d008cad4a'
    WHERE my_user_id = '560c4f458b97330d00b08331';
UPDATE my_sql_table
    SET my_user_id   = '55c4a0001b9e2d0e00032d78'
    WHERE my_user_id = '560c4f458b97330d00b08332';
UPDATE my_sql_table
    SET my_user_id   = '55c4a0001b9e2d0e00032d7b'
    WHERE my_user_id = '560c4f458b97330d00b08333';
UPDATE my_sql_table
    SET my_user_id   = '55ce2e78e1055a0d008cad51'
    WHERE my_user_id = '560c4f458b97330d00b08334';

使用Perl的命令行自動拆分選項很簡單

perl -anE'print qq{update my_sql_table set my_user_id = \'$F[1]\' where my_user_id = \'$F[0]\';\n}' ids.txt

輸出

update my_sql_table set my_user_id = '5237d5eee1399d2f11005571' where my_user_id = '560c4f458b97330d00b0832d';
update my_sql_table set my_user_id = '55c4a0001b9e2d0e00032d6f' where my_user_id = '560c4f458b97330d00b0832e';
update my_sql_table set my_user_id = '55ce2e78e1055a0d008cad3c' where my_user_id = '560c4f458b97330d00b0832f';
update my_sql_table set my_user_id = '55ce2e78e1055a0d008cad44' where my_user_id = '560c4f458b97330d00b08330';
update my_sql_table set my_user_id = '55ce2e78e1055a0d008cad4a' where my_user_id = '560c4f458b97330d00b08331';
update my_sql_table set my_user_id = '55c4a0001b9e2d0e00032d78' where my_user_id = '560c4f458b97330d00b08332';
update my_sql_table set my_user_id = '55c4a0001b9e2d0e00032d7b' where my_user_id = '560c4f458b97330d00b08333';
update my_sql_table set my_user_id = '55ce2e78e1055a0d008cad51' where my_user_id = '560c4f458b97330d00b08334';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM