You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:33:23