perlでsedの置換ができなくて困っています。
$sr1="123";
$sr2="456";
$answer = sed -i -e s/$sr1/$sr2/ /root/abc.txt
;
「s」コマンドが終了していません
なぜでしょうか・・・。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
最終的にファイルを置換して上書き保存したい
awkライクな上書きを実現するコマンドラインオプションが存在します。
これを使うと題意のようなケースではかなりのスクリプトの短縮化が図れるので、ワンライナーで手早く処理したい場合に重宝します。
ここでは対象データファイルをtest.txt、スクリプトをtest.plとして説明します。
test.plは次のような形になります。
perl
1#!/usr/bin/perl 2use strict; 3 4my $sr1; 5my $sr2; 6BEGIN{ 7 $sr1="123"; 8 $sr2="456"; 9} 10 11s/$sr1/$sr2/; 12
これを次のように実行します。
sh
1$ perl -p -i.bak test.pl test.txt
-pオプションは、スクリプトの前後にwhile(<>){と}があるものとして処理してくれます。
-i.xxxオプションは、元ファイルのバックアップを拡張子.xxxを付けた形で保存しつつ、対象ファイルをスクリプトの実行結果で置き換えてくれます。
投稿2017/10/05 02:53
編集2017/12/15 09:59総合スコア13669
0
はじめまして。
perlの中からsedを呼び出して使いたい場合には、以下のようにsystem()を
使って呼び出してしまえばよいかと。
$answer = system("sed -i -e s/$sr1/$sr2/ /root/abc.txt;");
この時 $answerには sedの実行結果が格納されます。
perl の構文が正しいかを知るために perl -wc *****.pl として
スクリプトの構文チェックをされてみると良いと思います。
構文上問題が内容であれば、 perl -wc ***** .pl を実行して、
syntax ok. が出力されます。
なお、せっかくperlで実行するのでsedを用いずに
s// を使ってperlだけで動かすことができます。
例:
my $sr1="123"; my $sr2="456"; my $result=""; open(INTXT,"/root/abc.txt") || die "IN Err:$!¥n"; while ($line = <INTXT>) { $line =~ s/$sr1/$sr2/; $result = $result . $line; } close(INTXT); open(OUTTXT,">/root/abc.txt") || die "OUT Err:$!¥n"; print OUTTXT $result; close(OUTTXT);
投稿2017/02/02 13:09
総合スコア250
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/03 02:39
2017/02/11 03:03
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。