sedで一連の7つの同じコマンドを実行するより良い方法は何ですか? [コピー]

sedで一連の7つの同じコマンドを実行するより良い方法は何ですか? [コピー]

本文からSed - ファイル内の単語の最初のkインスタンスを置き換える、ユーザーの提案:

sed 's/old/new/;s/old/new/;s/old/new/;s/old/new/;s/old/new/' filename

1行の単語の最初のkインスタンスを置き換える方法。これは、以前の親 k インスタンスを新しいインスタンスに置き換える問題に対するエレガントでない解決策のようです。話す方法、他のことをする方法もあります。しかし、sedを使用して1行から最初のk個の単語を置き換える問題に対する他の(または他のエレガントな)解決策はありません。

シニア/医師:

私は追跡したいあらゆる種類の奇妙な小さなものに本当に役立つ「スラグ」と呼ばれる多くの項目を持っています。それらは次のとおりです。

#slug YYYY/MM/DD d hhmm field1 field2 field3 notes

私はそれらを一連の日付を持つ文書に保存します。それからgrep | sed | awkチェーンを介してファイルを配置して、データからレポートを生成します。近所の犬が吠えて夜に私を目覚めさせるとしましょう。犬の吠え声が聞こえるたびに時間を記録し、それをログファイルに記録します。

#bark 2016/04/06 W 0214 0232 Police showed up!

しばらくすると、データベースを保存し、満月に犬が吠えるなど、いくつかの傾向に気付くことを願っています。アプレットチェーンは次のとおりです。

grep "^#[Bb][Aa]" 2014* 2015* 2016* |\
sed 's/ /|/;s/ /|/;s/ /|/;s/ /|/;s/ /|/' |\
awk {something or other} >\
barking-dog-report

だから私の質問はsed部分です。

sed 's/ /|/;s/ /|/;s/ /|/;s/ /|/;s/ /|/'

これは、「最初の5つのスペースをパイプに置き換える」と解釈されます。 awkではフィールド区切りとしてパイプを使用しています。このようなコマンドはs/ /|/5機能せず、各行の5番目のスペースをパイプに変更します。私はこの一連のsedコマンドがうんざりしていると思います。s/ /|/gスペースをフィールド区切り文字として使用する代わりに、コメントセクションでスペースを保持したいので、グローバル置換ではありません。

答え1

5つのコマンドを1つにまとめることができますsed(ただし、それが短くなるわけではありません)。

sed 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \(.*\)/\1|\2|\3|\4|\5|\6/'

ただし、grep検索をスクリプトに入れることで、sedシェルコマンドを1つ減らすことができます(ここでは元の代替コマンドが使用されます)。

sed -n '/^#[Aa][Bb]/{s/ /|/;s/ /|/;s/ /|/;s/ /|/;s/ /|/;p;}' files |\
awk '...' > report

関連情報