bash - 在 bash 中使用数组更改行分隔文本文件

标签 bash awk sed

不确定这个问题是否已经被问过,但基本上我想从包含特殊字符的 file1 中读取并将它们更改为 URL 编码版本。 file2 是一个管道分隔的文档,例如:#|%23。

So when the script reads from the file1 a "#" it would change this to "%23". There are 174 different characters to recognise so if statements wouldn't be feasible.

注意:我写的是 bash

我正在考虑使用 sed 或 awk 之类的东西,但我不知道如何将其与文本文件一起使用。

有什么建议吗?

最佳答案

awk -F '|' '
   FNR == NR { Trsl[ $1 ] = $2; next}
   FNR != NR { 
      s0 = $0
      for( Char in Trsl) {
         Cnt = split( s0, a0, Char )
         s0 = a0[ 1 ]
         for( i = 2; i <= Cnt; i++) s0 = s0 Trsl[ Char] a0[ i]
         }
      print s0
     }
   ' File2 File1
  • 文件顺序对于在要翻译的文件之前读取翻译文件非常重要
  • 假设|不在特殊字符列表中
  • 由于元字符出现意外结果,无法使用 gsub
  • 正如 @karakfa 所说,翻译顺序(与 File2 条目相关)不会保留,因此如果在早期翻译结果中使用字符,则可能会出现一些不需要的结果,如 -> % 20% -> Percent 之后将为原始
  • 提供 Percent20

关于bash - 在 bash 中使用数组更改行分隔文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32586597/

相关文章:

java - 连续运行shell脚本时JVM进入休眠状态

linux - 从文件中删除字段保持定界符不变

linux - 在输出文件中添加一列以跟踪来自原始输入文件的记录

awk - 提取txt文件中starttext和endtext之间的跨度,恰好n次

bash - Docker 和 cron 环境

linux - ubuntu bash 在系统中打印结果带有额外的 ""

bash - 如何将大型 tar.gz 文件的内容通过管道传输到 STDOUT?

bash - 使用 AWK 或 Sed 如何删除第一个 txt 之前的尾随回车符和换行符

mysql - 使用 sed/awk/grep 改变句子的顺序

linux - 将目录中每个文件的标签之间的文件内容提取到新位置