私のファイルには3つの列があります。
apple1 10109283 20012983
apple1 10983102 10293809
apple1 10293893 2349823049
apple10 109283019 109238901
apple10 192879234 234082034
apple10 234908443 3450983490
列1(この場合は行3または6)でこの文字列の最後の項目を見つけ、列3の対応する数字を別の数字に置き換えたいと思います。はい(行3、列3を444444444に置き換えます)
apple1 10109283 20012983
apple1 10983102 10293809
apple1 10293893 444444444
apple10 109283019 109238901
apple10 192879234 234082034
apple10 234908443 3450983490
これまでsedを試してみましたが、うまくいきません。
sed '$s/apple1*$/444444444/'
ベストアンサー1
パイプのない純粋なsed
ソリューションtac
このような場合、行ごとのアプローチはsed
役に立ちません。-z
GNUのオプションのように、バッファ全体を一度に処理することをお勧めします(ポータブルな代替方法を見るにはsed
linuxとGNUを使用するようです)。sed
このQ&A)。
これで欲張りな性格を活用できます。他のすべての出現は食べられるので、.*
パターンは.*apple1
最後の出現を含むすべてと一致します。apple1
.*
次に、次のフィールド(\s+
列区切り文字、[0-9]+
2番目の列、その他の列\s+
、すべてのGNU拡張正規表現)を追加し、()
それを置き換えて再利用できるようにします\1
。次に、外部に3つの列を追加して置き換えると、()
結果は次のようになります。
sed -zE 's/(.*\napple1\s+[0-9]+\s+)[0-9]+/\14444444/'
それはすべてです。
GNUを使用していないユーザーのsed
ための注意:ポータブルソリューションはあまり便利ではありません。
sed -E 'H;1h;$!d;x;s/(.*\napple1[[:space:]]+[0-9]+[[:space:]]+)[0-9]+/\14444444/'