Shell脚本写入文件时如何移除\n字符?YAD输入异常处理
解决YAD文本框输入转义换行写入文件的问题
问题现象
从YAD的文本输入字段获取代码内容后写入C/C++文件时,输入中的换行被转义成\n字符直接写入文件,而非实际的换行符,且问题偶发。相关脚本及异常输出如下:
现有Shell脚本
#!/bin/bash language=$(yad --form --field="Select Language:CB" "C!C++" --button="OK:0" --button="Cancel:1" --width=300 --height=100) if [ $? -eq 0 ]; then selected_language=$(echo "$language" | awk -F"|" '{print $1}') code=$(yad --form --field="Your Code:TXT" --title="Problem-A Solution" --button="OK:0" --button="Cancel:1" --width=800 --height=600) if [ $? -eq 0 ]; then if [ "$selected_language" = "C" ]; then "${code%?}" > "solc.c" gcc solc.c elif [ "$selected_language" = "C++" ]; then "${code%?}" > "sol1.cpp" g++ sol1.cpp else echo "Invalid language selected." exit 1 fi fi fi
当前异常文件内容(solc.c)
#include <stdio.h>\n\nint main() {\n long long a, b;\n scanf("%lld %lld", &a, &b);\n printf("%lld\\n", a + b);\n return 0;\n}\n return 0;\n }\n
期望文件内容
#include <stdio.h> int main() { long long a, b; scanf("%lld%lld", &a, &b); printf("%lld\n", a + b); return 0; }
核心解决方法
问题根源是YAD的--form对文本字段的输出会将换行转义为\n字符串,直接写入文件时不会自动解析为实际换行。以下是针对性修改方案:
方法1:用printf %b解析转义序列
printf的%b格式符会自动解析字符串中的转义字符(如\n转为实际换行),替换脚本中写入文件的语句:
C语言分支修改:
printf "%b" "${code%?}" > "solc.c"
C++分支修改:
printf "%b" "${code%?}" > "sol1.cpp"
修改后的完整分支代码:
if [ "$selected_language" = "C" ]; then printf "%b" "${code%?}" > "solc.c" gcc solc.c elif [ "$selected_language" = "C++" ]; then printf "%b" "${code%?}" > "sol1.cpp" g++ sol1.cpp
方法2:用sed替换转义换行
通过sed将字符串中的\n替换为实际换行符,适合需要额外处理其他转义的场景:
C语言分支修改:
echo "${code%?}" | sed 's/\\n/\n/g' > "solc.c"
C++分支修改:
echo "${code%?}" | sed 's/\\n/\n/g' > "sol1.cpp"
额外去除转义换行的技巧
- 使用
echo -e解析转义:echo -e也能解析转义字符,但注意部分环境下echo的行为可能因POSIX标准差异有所不同:echo -e "${code%?}" > "solc.c" - 调整YAD输出模式:如果使用
--text-info组件替代--form的TXT字段,YAD会直接输出原始换行而非转义后的\n,适合纯文本输入场景:
这种情况下无需额外处理,直接写入文件即可。code=$(yad --text-info --editable --title="Problem-A Solution" --button="OK:0" --button="Cancel:1" --width=800 --height=600)
内容的提问来源于stack exchange,提问作者ShashidharM
相关产品推荐
相关产品推荐

