質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Q&A

3回答

5720閲覧

perlでsedの置換ができない

shigoto

総合スコア30

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

0グッド

0クリップ

投稿2017/02/02 09:29

perlでsedの置換ができなくて困っています。

$sr1="123";
$sr2="456";

$answer = sed -i -e s/$sr1/$sr2/ /root/abc.txt;

「s」コマンドが終了していません

なぜでしょうか・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
KojiDoi

総合スコア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

KOBAYASHI.Jun

総合スコア250

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shigoto

2017/02/03 01:47

perlでsedコマンドを使用しなくてもできることを知りませんでした。ありがとうございます。
shigoto

2017/02/03 02:39

すみません、追加で質問してもいいでしょうか。 最終的にファイルを置換して上書き保存したいのですが。sedコマンドには上書オプションがあり、 sed -i -e s/$sr1/$sr2/ /root/abc.txtでファイルを読んで上書きすることができますが、 perlのみでs//を使用した場合は、同様なことをするには、ファイルをopenコマンド開いて 読んでいくスクリプトをくまないといけないのでしょうか?
KOBAYASHI.Jun

2017/02/11 03:03

perlだけで完結させる場合には、 同じファイルに編集結果を書着込む場合にはファイルをopenコマンドで開く(ファイルハンドルを結びつける)が必要になるかとおもいます。(読み込みも同様です)
guest

0

エラーになりませんけど。
本当にエラーが出ますか?勘違いでは?

投稿2017/02/02 13:00

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shigoto

2017/02/03 01:46

すみません、変数に改行が含まれていたみたいでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問