如何<
在数据中的 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'
它将所有出现的 替换foo
为bar
。
具体来说,要在每个之前添加换行符<
,您可以
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 解析器xmlstarlet
,xq
就像您开始尝试重新格式化它以使用面向行的工具进行解析之前的样子一样。