xargsとsedを組み合わせてaaファイルを変更または変更します


0

ファイル内の行の最後にある一般的なパターン*** _ 23を検索していますが(同じ:at_23ではありません)、同じソースファイル内のすべての検出結果を\ <23>に変更しようとしています(挿入関数はsedです-i)
私はやっています:

egrep '[b-s u v w x y z ]+_[0-9]+$' sst_piso_top_c0.spf_typ_C | xargs...

しかし、sedを続行しようとしても失敗しました。

誰かがxargsの後に続ける方法を説明できますか?リストをsedに配信し、sedにリスト内の各リストを処理し、同じファイルで変更するように指示するにはどうすればよいですか?


ここでの最初の解決策はほとんど良いです。問題は*たとえば:* 13 digital_in_13 <-翻訳する-> digital _ \ <31 \>一方で私は_%d%dのみを検索することができます。禁止されています。多分私はstatment \を追加する必要があります
多くの

OK。これは私がする必要があることであり、Shevekの最初の答えは近かったです:digital_in_31 => digital_in \ <31 \> digital_in_158 => digital_in \ <158 \> blabla_out_112 => blabla_out \ <112 \>今より明確になっていることを望みます... :
多くの

回答:


0

私は問題を理解していないかもしれませんが、あなたsedはそのために使用するだけです:

$ sed -ri 's/[b-suvwxyz]+_([0-9]+)$/\\<\1>/g' sst_piso_top_c0.spf_typ_C

ここでは()、その値をキャプチャ\1し、置換セクションに出力するために使用しています。


0

そこ結合する必要はありませんegrepとは、sed両方のコマンドは、ファイル内の一致を検索しますのでどちらかの出力結果は、( egrep)、またはそれらに作用する(sed)ので、sed一人で行います。しかし、なぜあなたのラインが機能しなかったのかを理解するために、あなたの例で行きます:

通常のegrep出力は、filename:matching_line複数のファイルでmatching_line実行される場合と単一のファイルで実行される場合の形式を持ちますが、sedファイル名のみを想定しています。通常のegrep出力を抑制し、一致するものを含むファイルの名前のみを印刷するには、-lオプションを使用します。

また、文字リスト([...])にスペースを入れたくない場合は、スペースが欲しくなりすぎて、複数の単語と一致します。動作する行は次のとおりです。

$ egrep -l '[b-su-z]+_[0-9]+$' sst_piso_top_c0.spf_typ_C | xargs sed -ri 's/[b-su-z]+_([0-9])+$/\\<\1>/g'

複合コマンドが機能しない場合は、通常、個別のピースを単独で実行して結果を確認することをお勧めします。また、「No such file」などのエラーメッセージは、通常、正しい方向を示します(ここでレポートに含めることをお勧めします)。

最後に、前述のように、結合することは意味がegrepありsedません。賢明な線は

$ sed -ri 's/[b-su-z]+_([0-9])+$/\\<\1>/g' sst_piso_top_c0.spf_typ_C

更新:正規表現にタイプミスがありましたが、修正しました。また、元々はzuazoによって含まれていた試合の数字への後方参照も含めました。あなたが今書いたコメントから、完全に一致した\<23>ものを私が最初に理解したような静的な表現に置き換えたくないが、一致した数字を山括弧で表示したいことがより明確に思えます...


しかし今- >:* 13 digital_in_13は、デジタル_ \ <31 \>に変換
meny

_inはdisapperedた
meny

これin_は、正規表現の次の部分と一致するため消えました[b-su-z]+_。あなたの質問から、これがあなたが望んでいたことのように思えました。他の何かを探している場合は、一致するものとそうでないものをより明確に(おそらく2行または3行の例を使用して)指定してください。
-Shevek

@meny元の質問の下にある最新のコメントで説明した要件を満たすために、新しい回答を追加します(新しいユーザーであるため、自分の回答の下にのみコメントを書くことができます)。
-Shevek

0

OK、質問の下のコメントで明確にした要件を満たすために、私は物事を2つの部分に分けます:

  1. at_最終番号の直前に読み取るすべての行を除外する
  2. 残りの行から、最後にあるアンダースコアを削除し、バックスラッシュが前に付いた山括弧で数値を囲みます。

パート1の解決策:

これは、望んでいないものと正確に一致する正規表現を記述し、一致しない行のみを出力するように呼び出しコマンドに伝えることにより、最も簡単に実行できます。これはで最も簡単に実行できるgrepため、使用してみましょう。

egrep -v "at_[0-9]+" sst_piso_top_c0.spf_typ_C

-vまたは--invert-matchオプション伝えるgrep唯一の非マッチングラインを印刷します。

パート2の解決策:

これはseds(ubstitute)-command で最も簡単に行えます:

sed -r 's/_([0-9]+)$/\\<\1\\>/g'

正規表現は、アンダースコアと行末の数字に一致します。番号部分を角かっこ(...)で囲むことにより\1、置換セクションに貼り付けることができます。完全な置換セクションは、数値の後方参照を囲むバックスラッシュ付きの山括弧で構成されています\\<\1\\>。バックスラッシュは\\特別なエスケープ文字として扱われるため、別のバックスラッシュでエスケープする必要があります。

すべてを一緒に入れて:

egrep1. のコマンドからの出力をsed2. のコマンドにパイプすると、sedコマンドはそれを入力ストリームとして使用します。

egrep -v "at_[0-9]+" sst_piso_top_c0.spf_typ_C | sed -r 's/_([0-9]+)$/\\<\1\\>/g' > sst_piso_top_c0.spf_typ_C.new

通常、sed結果は標準出力に送信されるため、上記の行はそれらをファイルにリダイレクトします(> newfile)。このファイル名は、egrep読み取り元のファイル名と異なる必要があることに注意してください。そうしないと、読み取り元と同じファイルが上書きされ、空のファイルになってしまいます。


この回答が役立つと思う場合は、投票することを忘れないでください。;-)
Shevek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.