linux - 使用 sed 将大写替换为小写,空格来下划线,然后创建一个带有结果的 xml 文件
问题描述
如果在我搜索过但在使用读取文件时找不到如何sed
+时说明错误,请提前道歉。echo
while 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?
解决方案
您可以使用 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
推荐阅读
- elasticsearch - 如何查询从无痛 script_fields 返回的字段
- python - 不断在文本文件中搜索以查看是否存在预先识别的字符串
- visual-studio - 将DLL项目添加到解决方案VS2019
- unit-testing - 如何在 Loopback 4 的验收测试中模拟服务
- google-apps-script - Google 日历活动在错误的日期和时间创建
- php - 创建目录并将多个文件上传到创建的目录PHP
- reactjs - HEROKU react-router错误对象不是函数
- excel - Excel VBA 转大写
- c# - .NET 5.0:在多项目解决方案中构建项目
- regex - 使用正则表达式如何知道字符串的值是否为零?