2017-12-31 228 views
2

sedに引数としてファイル名を取得するスクリプトを作成しようとしています。4桁目の後に数字を複製する少なくとも3桁の行を出力するようにsedしました

私の目標は、少なくとも3つの 数字を含むファイル内のすべての行を印刷することです。 4桁目の後、すべての桁を繰り返す必要があります。私はsedを使って解決策が必要です。

例入力ファイル:

abc 1 def2 3 ab45 z11 
123 zy 
ab1cd2ef3gh4z56 
abc12aa 

所望の出力:

abc 1 def2 3 ab455 z1111 
123 zy 
ab1cd2ef3gh4z5566 

私が試してみました何:

sed '/[0-9].*[0-9].*[0-9]/d' ./F1 

4桁目以降はすべての数字をどのように複製できるか分かりません。

+1

これは宿題ですよね?質問が非常に不明であるため、先生に明確に説明してください。 –

答えて

6

は、次の操作を実行できます。

$ sed -E '/([[:digit:]].*){3}/!d;s/[[:digit:]]/&&/5g' infile 
abc 1 def2 3 ab455 z1111 
123 zy 
ab1cd2ef3gh4z5566 

最初のコマンド、/([[:digit:]].*){3}/!dは、少なくとも3桁の数字が含まれていないすべての行を削除します。

第2のコマンドs/[[:digit:]]/&&/5gは、数字を繰り返します。 5gフラグは、「5つ目以降のすべての発生」に変換されます。数字フラグをgと混ぜたときの動作は、POSIXでは指定されていません。 GNU sedは望ましい方法で動作します。

-Eフラグは便宜上のものです。それなしで、私たちは(){}をエスケープする必要があります。

sed '/\([[:digit:]].*\)\{3\}/!d;s/[[:digit:]]/&&/5g' infile 

あなたのsedは-Eを理解していない場合は、代わりに-rを使用する場合があります。 -EはGNU sedで何年も受け入れられていますが(文書化されていませんでした)、BSD sedsも-Eを使用しています。 POSIXには、hereと書かれているように、sedには-Eが含まれます。いくつかの古いシステムでは、-rしか理解できません。

+0

だからシンプル... + 1、私は完全に ' g'フラグを忘れてしまった... – PesaThe

+0

@Micael申し訳ありません、良い点を挙げるように編集を「拒否」するのではなく、「改善」するつもりでした。 - クリックした... –

1

sedは絶対にこの間違ったツールですが、それは楽しい挑戦です:

sed -E -e '/([^0-9]*[0-9]){3}/{ h; s///; 
    s/([0-9])/\1\1/g; x; s/(([^0-9]*[0-9]){3}).*/\1/; G; s/\n//; }' input 

は基本的に、あなたがラインを保持し、その後、先頭部分(最初の3桁)を取り除きます。次に、すべての桁を複製し、スペースを保持するためにスワップして元の行をパターンスペースに戻します。テイルを削除してから、新しいテールをホールドスペースからパターンスペースに追加してください。 GNUのsedので

+0

's ///;'はどうしたらいいの?おそらくドキュメンテーションを指すのでしょうか? – PesaThe

+0

空のパターンが最後の一致を繰り返します。これは、5thの代わりに、4thの数字を複製しませんか? –

+0

@PesaThe https://www.gnu.org/software/sed/manual/sed.html#Regexp-Addresses、「空の正規表現...」 –

関連する問題