テキストファイルの各行でn番目に出現する文字列を置き換える


15

スペースで区切られた文字列(2〜5)の大きなテキストファイルがあります。文字列には「 '」または「-」を含めることができます。2つ目のスペースをパイプに置き換えたいと思います。

行くための最良の方法は何ですか?

sedを使用して私はこれについて考えていました:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

他の/より良い/より簡単なアイデア?

回答:


22

代替コマンドの最後に番号を追加できます。たとえば、次の例では、の2番目の出現箇所をの各行oldの文字列newに置き換えますfile

sed 's/old/new/2' file

したがって、提案されたソリューションの代わりに、以下を使用できます。

sed 's/ /|/2'

詳細については、このsedチュートリアルなどを参照してください


2
sed情報ファイルから:「注:POSIX標準では、g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across sedの実装を混在させるとどうなるかは指定されていません。GNU `sed 'の場合、相互作用は次のように定義されています:NUMBER番目の前の一致を無視し、すべてを一致させて置換NUMBER番目以降に一致します。」
追って通知があるまで一時停止。

情報ファイル...嫌いです。とにかく、あいまいな部分を削除しました。良いコメント、+ 1。
mrucci

1
ありがとう、mrucciとDennis。そこには単純な何かがあるに違いないと思いました。
dnkb、

テキスト操作に関して私が抱えているすべての問題のようですが、私は何とか解決していsedます。sedもっと役に立ててくれてありがとうとは思いますが、とにかくそうします。;)
ジェイミー

1

バージョンを試しましたか?うまくいきましたか?基本的にはいい考えだと思うので。ただし、少し異なる方法で行います。

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

これは、スペースではない単語の任意の文字を受け入れ、最初の2つの単語の間に複数のスペースを受け入れます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.