各行ごとにパイプで区切られたファイルを使用して、UNIXファイルで次のことを行う方法を探していますが、どこから始めるべきかわかりません。
- テキスト行で文字を検索する(GREPと仮定?)
- 見つかった場合は、行の末尾にテキストを追加します(SEDを使用しますか?)。
- 見つからない場合は、同じ行で別の文字を探します。
- 見つかった場合は行の末尾にテキストを追加し、そうでなければ何もしません。
- ファイルのすべての行を繰り返します。
どんなアドバイスも本当にありがとうございます。
答え1
それがすべてですsed
。追加のツールは必要ありません。
foo
aを含む行の末尾に追加し、aを含む行の最後に追加したいとしますf
。bar
f
b
sed '/f/{
s/$/foo/
b
}
/b/s/$/bar/'
/pattern/
そのパターンが含まれている場合にのみ、次のコマンドが実行されるように行を「アドレス指定」できます。したがって、例では、f
コマンドグループの置換と実行をトリガーする行を含む行のみが適用されるため、内部の内容はすべてアドレスが一致する場合にのみ適用されます。一致を防ぐには、スクリプトの最後に分岐してください。s
b
{}
b
b
分岐のない他のアプローチ:
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では面白いかもしれません。