在文字欄位後面新增行

在文字欄位後面新增行

如何<在資料中的 a 之前新增行?

我目前的日期看起來像

<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0" <VALUE MAGID="2" MAGNAME="Heal" TYPE="4" <VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7" <VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7" <VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"

輸出應該是

<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0" 
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4" 
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7" 
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7" 
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0" 

答案1

要替換文字模式,您可以使用sed的“s”命令,例如

sed 's/foo/bar/g'

它將所有出現的 替換foobar

具體來說,要在每個之前添加換行符<,您可以

echo '<value ... <value ...' | sed 's/</\n</g'

如果您不喜歡在開頭添加換行符,您可以這樣做:

echo '<value ... <value ...' | sed 's/\(.\)</\1\n</g'

答案2

sed 's/</\n&/g'
  • s參數告訴 sed 選擇並替換s字串[文本]
  • sed 使用這種格式/selectText/ReplaceText/--> 例如,/<//這會刪除符號<,僅刪除第一個<
  • 要選擇所有,<請使用g末尾的參數/select/replace/g,這意味著替換您找到的所有內容,例如,替換所有<
  • \n新增一個參數新隊必須用\反斜線書寫
  • &參數告訴 sed 複製並貼上所有內容在本例中,選擇了什麼< 價值...

答案3

如果您有 GNU,您可以按照其他答案的建議進行操作sed

sed 's/</\n</g' file

但是,如果您沒有 GNU sed,例如在 macOS 或其他一些 BSD 系統上,您可能需要使用文字換行符號來代替\n替換文字中的轉義序列:

sed 's/</\
</g' file

這看起來有點難看,但標準sed根本無法識別替換文字中\n除「文字字元」之外的任何內容。n

您可以透過使用y///命令將所有內容替換為<換行符號來解決醜陋的語法(此處,\n 識別為“換行符”),然後重新插入<字元:

sed -e 'y/</\n/' -e 's/\n/&</g' file

若要從中過濾出第一個結果行(該行將為空),請透過管道tail -n +2

$ sed -e 'y/</\n/' -e 's/\n/&</g' file | tail -n +2
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"

…。但理想情況下,您將使用類似於原始 XML 檔案的 XML 解析器xmlstarletxq就像您開始嘗試重新格式化它以使用面向行的工具進行解析之前的樣子一樣。

相關內容