2016-08-29 21 views
-1

すべて perlを使用して特定の文字列を含む行の先頭と末尾に文字列を追加する方法を知りたいですか?特定の文字列を含む行の先頭と末尾に文字列を追加する

たとえば、私の行には以下が含まれています: %abc%efd; と私はそれが次のようになりますので、行の末尾に行と456の先頭に123を追加したい:

123%ABC%EFD 456

8/30/16 UPDATE- ------------------------------- これまで私はこのようなことをしています:

foreachファイル(find . -type f) perl -neの/^\%abc \ s +(\ S *)/ ** \%abc $ 1 /;印刷; $ファイル> tmp; MV TMP $ファイル 終わり

foreachのファイル(find . -type f) のperl -neさん/ $ \%DEF \; \ sの+(\ S *)/ \%DEF \; ** \ nは$ 1 /;印刷; $ファイル> tmp; mv tmp $ file end

これは、abcとdefが1つの文字列にない場合を除いて、これはかなりうまくいきます。例えば :何かが何か
%DEF

これは %ABC
何か何か何か
%のDEFであることが判明するだろう

% ABC
何か。

これは私が望むものではありません。

ありがとうございました

+0

したがって、埋め込み改行、またはこれは複数行のファイルですか? – DavidO

答えて

-1

ようこそStackOverflow。私たちは、101のチュートリアルやドキュメンテーションで簡単に解答を得ることができる、一回限りの質問に答えるのではなく、既存のコードで問題を解決し、言語を学ぶのを手助けするよう努めています。あなたが投稿した質問のタイプは、学習の余地があまりなく、将来の学習者を助けることはあまりありません。それは、あなたがこれまで働こうとしてきたものを含め、より完全な例を投稿できるなら、私たちを大いに助けるでしょう。

Perlの文字列の先頭に追加する方法は2つあります。1. concatenation演算子、.および2文字列interpolation

  1. 連結

    一緒に2つの文字列を結合するために.を使用してください。操作を連鎖させて、より長い文字列を構成することができます。

    my $str = '%abc %efd'; 
    $str = '123 ' . $str . ' 456'; 
    say $str; # prints "123 %abc %efd 456" with a trailing newline 
    
  2. 補間

    (すなわち見つけると評価)文字列で囲まれた任意のPerlスタイルの変数を補間するためにPerlを指示する二重引用符で文字列を囲みます。

    my $str = '%abc %efd'; 
    $str = "123 $str 456"; 
    say $str; # prints "123 %abc %efd 456" with a trailing newline 
    

あなたはどちらの例では、我々が先頭に追加し、既存の文字列に追加ことに気づくでしょう。これらの操作の結果を保持する新しい変数を作成することもできます。文字列を操作して構築する他の方法には、printfsprintf関数、substr関数、join関数、およびregular expressionsがあります。これらはすべてPerlの学習を続けながら遭遇します。

if (index($str, '%abc %efd') >= 0) { 
# or... 
if ($str =~ /%abc %efd/) { 

あなたのPerlスクリプトの先頭にuse strict;に覚えておいてください:限り、文字列操作を実行する前に、特定の部分文字列が含まれているかどうかを調べてと、あなたがindex関数や正規表現を使用することができます

常に少なくとも(あなたが学んでいる間は)myで変数を宣言してください。 say機能に問題がある場合は、use feature 'say';というステートメントをスクリプトの先頭に追加する必要があります。

優れたPerlチュートリアルのインデックスはlearn.perl.orgです。頑張って楽しんでね!ここで

UPDATEは(私は信じている)あなたの改訂質問に対する完全な答えである:

find . -type f -exec perl -i.bak -pe's/^(%abc)\s+(\S*)\s+(%def;)$/**\1 \2 \3**/' 

これは適切にファイルを変更し、拡張子.BAKでバックアップファイルが作成されます。式\S*は、空白以外の文字にのみ一致します。空白を含む文字列と一致させる必要がある場合は、この式を更新する必要があります(.*?などが有効です)。

+0

チップありがとうございます –

+0

@IanChangご質問ありがとうございます。あなたがさらに援助をしたいならば! – mwp

0

あなたの場合、ファイルの行が特定の文字列と一致するときに文字列を追加したい場合は、一致して置換することを意味します。

まず、入力ファイルの各行を読み取ります。

第2に、最初と最後に文字列を追加する文字列と一致するかどうかを確認します。

次に、追加の開始文字列、一致文字列および追加の終了文字列を含む新しい文字列で一致文字列を置き換えます。

my $input_file = 'your file name here'; 
my $search_string = '%abc %efd'; 
my $add_begin = '123'; 
my $add_end = '456'; 
# Read file 
open(my $IN, '<', $input_file) or die "cannot open file $input_file"; 
# Check each line of file 
while (my $row = <$IN>) { 
    chomp $row; 
    $row =~ s/^($search_string)$/$add_begin $1 $add_end/g; 
    print $row."\n"; 
} 

以下のように入力ファイルで試してみてください:私たちは期待どおりの結果を受け取ることになります

%abc %efd 
asdahsd 
234234 
%abc 
%efd 
%abc%efd 

123 %abc %efd 456 
asdahsd 
234234 
%abc 
%efd 
%abc%efd 

を任意の問題があるかどうあなたの条件として、コードを変更して、私に連絡。

0

m修飾子を使用して、開始行と終了行を1行ずつ置き換えます。一緒に使用される

s/^\%abc/123 $&/mg; 
s/\%def$/ 456/mg; 

、/ MSとして、彼らは」をしましょう。"^"と "$"を文字列内の改行の直前と直前にそれぞれ一致させながら、任意の文字に一致させます。source

関連する問題