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

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

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

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

sed

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

3500閲覧

正規表現で2つ以上連続する文字の文字単位置換

aquaS

総合スコア191

Perl

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

sed

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/08/04 01:37

Linux(Ubuntu 14.04)のコマンドライン(perl -pe とか sed とか etc.)で実現したいのですが、方法が思い付かず。助けて下さい。

仕様:
指定された同じ文字が2つ以上(上限無し)で連続しているケースで、
その各文字毎に別の文字列(2文字)に置換する。

例)
AgggBgCDggE

指定文字:g
置換文字列:xy

gが2つ以上連続しているのは、
AとBの間のggg
DとEの間のgg
です。

この時、以下のように置換します。
AxyxyxyBgCDxyxyE

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

$ echo 'AgggBgCDggE' | perl -pe 's/g{2,}/"xy" x length($&)/eg' AxyxyxyBgCDxyxyE

投稿2018/08/04 02:47

emasaka

総合スコア524

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

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

aquaS

2018/08/04 03:38 編集

ありがとうございます。助かりました。 正規表現にしか頭が行ってなかったのですが、こういう書き方が出来るのですね。 ちなみに元の目的が、2つ以上連続する空行を行番号付きで出力する、というものでしたが、 perlの構文と組み合わせたらもっと簡単に出来るかもしれませんね。。 目的のコマンド ``` perl -pe 's/^\n/\x1/g' hello.c | perl -pe 's/\x1{2,}/"\x2\x1" x length($&)/eg' | perl -pe 's/\x1/\n/g' | grep -n $'\x2' | perl -pe 's/\x2//g' ```
guest

0

$ echo 'AgggBgCDggE' | perl -pe 's/g{2,}/"xy" x length($&)/eg'

$&は非推奨です。非常に遅くなることが知られているので、こういうときは「捕捉グループ」を使います。

$ echo 'AgggBgCDggE' | perl -pe 's/(g{2,})/"xy" x length($1)/eg'

ちなみに元の目的が、2つ以上連続する空行を行番号付きで出力する、というもの

それならわざわざ正規表現を使う必要はありません。

perl -ne '($p eq "\n") and ($_ eq "\n") and ($x{$.-1}, $x{$.})=(0, 0); $p=$_; END{for $i (sort {$a<=>$b} keys %x){print "$i\n"}} ' input.txt

投稿2018/08/04 05:07

KojiDoi

総合スコア13671

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

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

aquaS

2018/08/04 06:40

ありがとうございます。
guest

0

sedでは無理だと思います。

Bash

1echo AgggBgCDggE | ruby -pe 'gsub(/g{2,}/){|x| "xy"*x.size}' 2#=> AxyxyxyBgCDxyxyE

投稿2018/08/04 02:54

otn

総合スコア84505

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

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

aquaS

2018/08/04 03:39

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問