首页 > 解决方案 > 使用 sed 将大写替换为小写,空格来下划线,然后创建一个带有结果的 xml 文件

问题描述

如果在我搜索过但在使用读取文件时找不到如何sed+时说明错误,请提前道歉。echowhile loop

我有一个如下所示的 before.txt 文件:

The sun is Shining
The moon is dull tonight
I Feel Like Dancing

我需要它看起来像这样:

<message>
        <source>the_sun_is_shinig</source>
        <translation>The sun is Shining</translation>
</message>
<message>
        <source>the_moon_is_dull_tonight</source>
        <translation>The moon is dull tonight</translation>
</message>
<message>
        <source>i_feel_like_dancing</source>
        <translation>I Feel Like Dancing</translation>
</message>

这是我到目前为止...

#!/bin/bash

echo -n "" > json.xml
while IFS='' read -r line || [[ -n "$line" ]]; do
   sed -e 's/\(.*\)/\L\1/; s/ /_/g' < "$line" > temp.txt
   sourceline="$(cat temp.txt)"
   echo "<message>" >> json.xml
   echo -e "\t<source>${sourceline}<source>" >> json.xml
   echo -e "\t<translation>${line}<translation>" >> json.xml
   echo "<message>" >> json.xml
done < "$1"
rm -f temp.txt
cat json.xml
exit

但它失败了

cp@0000 ~/work $ bash .language_file_fixer.sh before.txt
.language_file_fixer.sh: line 5: The sun is Shining: No such file or directory
cat: temp.txt: No such file or directory
.language_file_fixer.sh: line 5: The moon is dull tonight: No such file or directory
cat: temp.txt: No such file or directory
.language_file_fixer.sh: line 5: I Feel Like Dancing: No such file or directory
cat: temp.txt: No such file or directory
<message>
        <source><source>
        <translation>The sun is Shining<translation>
<message>
<message>
        <source><source>
        <translation>The moon is dull tonight<translation>
<message>
<message>
        <source><source>
        <translation>I Feel Like Dancing<translation>
<message>

如何将 $line 导入 sed?

标签: linuxbashunixsedpipe

解决方案


您可以使用 GNU 完全做到这一点sed(sed 会逐行读取输入文件并阅读您的说明以处理每一行):

输入:

$ more messages 
The sun is Shining
The moon is dull tonight
I Feel Like Dancing

输出:

$ sed -n 'h;s/\(.*\)/\L\1\E/;s/ /_/g;s/\(.*\)/<message>\n\t<source>\1<\/source>/p;x;s/\(.*\)/\t<translation>\1<\/translation>\n<\/message>/p' messages 
<message>
        <source>the_sun_is_shining</source>
        <translation>The sun is Shining</translation>
</message>
<message>
        <source>the_moon_is_dull_tonight</source>
        <translation>The moon is dull tonight</translation>
</message>
<message>
        <source>i_feel_like_dancing</source>
        <translation>I Feel Like Dancing</translation>
</message>

说明:

出于阅读目的,让我将命令分成几行:

sed -n 'h; \
s/\(.*\)/\L\1\E/;  \
s/ /_/g; \
s/\(.*\)/<message>\n\t<source>\1<\/source>/p; \
x; \
s/\(.*\)/\t<translation>\1<\/translation>\n<\/message>/p' messages
  • 测试完成GNU sed 4.2.2
  • -n禁用自动打印模式的选项
  • h将行保存在保持缓冲区中(下面的所有操作都将在模式缓冲区上完成)
  • s/\(.*\)/\L\1\E/g用于将整行转换为小写
  • s/ /_/g用于变换下划线中的空格
  • s/\(.*\)/<message>\n\t<source>\1<\/source>/p用于添加起始标签<message>,后跟换行符、制表符并<source> <\/source>围绕转换后的消息
  • p用于打印它
  • x用于交换两个缓冲区,执行此操作后,模式缓冲区按原样包含行
  • s/\(.*\)/\t<translation>\1<\/translation>\n<\/message>/p用于在打印结果之前添加<translation>标签和结束<\/message>标签p

推荐阅读