![Unix 中逐行修改](https://rvso.com/image/112016/Unix%20%E4%B8%AD%E9%80%90%E8%A1%8C%E4%BF%AE%E6%94%B9.png)
我正在尋找一種方法,在 UNIX 中對每一行使用管道分隔檔案執行以下操作,但不確定從哪裡開始:
- 尋找一行文字中的字元(假設使用 GREP?)
- 如果找到,則在該行末尾添加一些文字(使用 SED?)
- 如果沒有找到,則在同一行中尋找另一個字符
- 如果發現在行尾添加文本,否則不執行任何操作
- 循環文件中的所有行
任何指示將不勝感激。
答案1
這就是全部sed
工作,您不需要額外的工具:
假設您想foo
在包含 an 的行末尾添加f
,並在不帶,但帶有 a 的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
(read as test) 命令來偵測前一個s///
命令是否成功並跳到目前行的 sed 程式碼末尾。另請注意語法:/regex/s/// => 如果一行包含正規表示式,則對該行執行替換。
答案3
Perl 也是一個有用的工具,可以輕鬆地一次完成所有事情。
因此,以 @Philippos 為例,perl 程式將如下所示(某些語法是可選的,添加是為了澄清):
perl -pe '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file
這將讀取file
並輸出結果。您也可以使用-pi -e
代替-pe
(-i
意思是“就地”)來“編輯”文件,因此:
perl -pi -e '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file
可能還有一種方法可以做到這一點,awk
儘管最初的測試失敗了(我對AWK 不太精通),用Ruby(看起來幾乎一樣,如果你想要例子,請告訴我),並且在純Bash 中它可以很有趣。