Unix 中逐行修改

Unix 中逐行修改

我正在尋找一種方法,在 UNIX 中對每一行使用管道分隔檔案執行以下操作,但不確定從哪裡開始:

  1. 尋找一行文字中的字元(假設使用 GREP?)
  2. 如果找到,則在該行末尾添加一些文字(使用 SED?)
  3. 如果沒有找到,則在同一行中尋找另一個字符
  4. 如果發現在行尾添加文本,否則不執行任何操作
  5. 循環文件中的所有行

任何指示將不勝感激。

答案1

這就是全部sed工作,您不需要額外的工具:

假設您想foo在包含 an 的行末尾添加f,並在不帶,但帶有 a 的bar行末尾添加fb

sed '/f/{
  s/$/foo/
  b
  }
/b/s/$/bar/'

您可以使用 來「尋址」行/pattern/,因此以下命令僅在包含該模式時才會執行。因此,在範例中,只有包含觸發替換和命令群組f執行的行,因此僅當位址匹配時才應用內部的所有內容。sb{}bb

沒有分支的不同方法:

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 中它可以很有趣。

相關內容