如何替换管道分隔TXT文件字符串内部双引号为撇号(保留外层双引号)
解决方案
方案1:sed 命令实现(Linux 环境直接使用)
利用「边界双引号仅会出现在行首、行尾、管道符前后」的特性,先标记边界双引号,替换完内部双引号后再还原边界标记:
sed -e 's/^"/\x01/g' \ -e 's/|"/|\x01/g' \ -e 's/"$/\x01/g' \ -e 's/"|/\x01|/g' \ -e 's/"/'\''/g' \ -e 's/\x01/"/g' input.txt > output.txt
命令逻辑说明:
- 前4步将所有边界位置的双引号替换为文本中几乎不可能存在的不可见字符
\x01做临时标记 - 第5步将剩余所有未标记的内部双引号替换为单引号
- 第6步将临时标记换回双引号,保留原有的字段边界
如果要批量处理当前目录所有.txt文件,可搭配循环使用:
mkdir -p output for file in *.txt; do sed -e 's/^"/\x01/g' -e 's/|"/|\x01/g' -e 's/"$/\x01/g' -e 's/"|/\x01|/g' -e 's/"/'\''/g' -e 's/\x01/"/g' "$file" > "output/$file" done
方案2:Python 实现(适合Jupyter/需要二次开发场景)
逻辑更直观,按管道符拆分字段后单独处理每个字段的内部引号即可:
import os def process_single_file(input_path, output_path): with open(input_path, 'r', encoding='utf-8') as f_in, open(output_path, 'w', encoding='utf-8') as f_out: for line in f_in: raw_line = line.rstrip('\n') # 按管道符拆分所有字段 fields = raw_line.split('|') processed_fields = [] for field in fields: # 剥离首尾边界引号,替换内部所有双引号为单引号后重新封装 inner_content = field[1:-1].replace('"', "'") processed_fields.append(f'"{inner_content}"') # 拼接回原格式写入 f_out.write('|'.join(processed_fields) + '\n') # 批量处理当前目录所有txt文件,输出到output目录 if __name__ == "__main__": os.makedirs("output", exist_ok=True) for fname in os.listdir("."): if fname.endswith(".txt"): process_single_file(fname, f"output/{fname}")
如果是在Jupyter中处理单个文件,直接修改输入输出路径调用process_single_file即可。
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

