Unixで1行ずつ修正

Unixで1行ずつ修正

各行ごとにパイプで区切られたファイルを使用して、UNIXファイルで次のことを行う方法を探していますが、どこから始めるべきかわかりません。

  1. テキスト行で文字を検索する(GREPと仮定?)
  2. 見つかった場合は、行の末尾にテキストを追加します(SEDを使用しますか?)。
  3. 見つからない場合は、同じ行で別の文字を探します。
  4. 見つかった場合は行の末尾にテキストを追加し、そうでなければ何もしません。
  5. ファイルのすべての行を繰り返します。

どんなアドバイスも本当にありがとうございます。

答え1

それがすべてですsed。追加のツールは必要ありません。

fooaを含む行の末尾に追加し、aを含む行の最後に追加したいとしますfbarfb

sed '/f/{
  s/$/foo/
  b
  }
/b/s/$/bar/'

/pattern/そのパターンが含まれている場合にのみ、次のコマンドが実行されるように行を「アドレス指定」できます。したがって、例では、fコマンドグループの置換と実行をトリガーする行を含む行のみが適用されるため、内部の内容はすべてアドレスが一致する場合にのみ適用されます。一致を防ぐには、スクリプトの最後に分岐してください。sb{}bb

分岐のない他のアプローチ:

sed '/f/s/$/foo/;s/^[^f]*b[^f]*$/&bar/'

練習として、いくつかの知識を持って自分でこれを見つけ、sed必要なときに使用できますman sed

答え2

どちらの場合も、行の末尾に同じテキスト文字列を追加するには(検索する文字:「X」「Y」)、次のようにします。

sed -e 's/[XY].*/&__ADDEDTEXT__/' yourfile

一方、文字に基づいて行末に別のテキストを配置するには、次のようにします。

sed -e '
   /X/s/$/__TEXT1__/; t
   /Y/s/$/__TEXT2__/
' yourfile

(テストで読む)コマンドを使用して、前のコマンドがt成功s///したことを確認し、現在のsedコード行の終わりにジャンプします。また、構文に注意してください。/regex/s/// =>行に正規表現が含まれている場合は、その行で置換を実行してください。

答え3

Perlは、すべてのタスクを一度に簡単に実行できる便利なツールでもあります。

したがって、@Philipposの例を使用すると、Perlプログラムは次のようになります(一部の構文はオプションであり、説明のために追加されます)。

perl -pe '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

file結果を読み出して出力します。-pi -e代わりに-pe-i「in place」を意味)を使用してファイルを「編集」することもできます。

perl -pi -e '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

これを行う方法があるかもしれません。awk初期テストは失敗しましたが(私はAWKに精通していません)、Ruby(ほぼ同じように見えます。例が欲しい場合は教えてください)と純粋なBashでは面白いかもしれません。

関連情報