[英]sed replace whole line by line number - chaining commands
我需要替換文件中的一行並與之斗爭。 首先,我需要在文件中找到一個字符串,將此行號存儲為變量,然后使用帶有新字符串的變量替換整行。
我嘗試了一些sed的變種,目前我的代碼如下:
line=$(grep -n "latitude" /tmp/system.cfg |cut -f1 -d:);
sed "{$line}s/.*/system.latitude=1.888888/" /tmp/system.cfg ;
我已經運行了第一個命令並成功設置了line
。 當回顯$ line時我得到176.然而,sed命令似乎沒有替換行,無論我是否使用變量或手動放置176這樣
sed "176s/.*/system.latitude=1.888888/" /tmp/system.cfg ;
我也嘗試了以下似乎將行寫入文件,但它添加了行,而不是覆蓋現有行:
sed -i $line'i'"system.latitude=1.76011" /tmp/system.cfg;
line=$(grep -n "latitude" /tmp/system.cfg |cut -f1 -d:);
我也試過使用單引號和雙引號無濟於事。 有人能指出我在哪里出錯了。
如果我理解你的話,你可以保存grep|cut
,你的要求可以用(gnu)sed一次性完成:
sed -i '/latitude/s/.*/system.latitude=1.888888/' /tmp/system.cfg
當他提到將grep完全從等式中切除時,Kent絕對是正確的。 對於這里感興趣的人是使用我的方法的最終代碼:
line=$(grep -n "latitude" /tmp/system.cfg |cut -f1 -d:);
sed -i "${line}s/.*/system.latitude=1.999/" /tmp/system.cfg;
但是我將與Kent的答案進行最終實施。
正如湯姆所指出的那樣,這是你承諾一個過程並使問題進一步復雜化的問題之一:
這就是所謂的XY問題。 你決定了一個過程(找到行,存儲到一個變量等)並詢問如何做到這一點,而不是簡單地問“如何替換匹配模式的整行”。 肯特做得好到底。 - Tom Fenech
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.