【问题标题】:Using an array to alter line delimited text file in bash使用数组更改 bash 中的行分隔文本文件
【发布时间】:2015-09-16 13:42:25
【问题描述】:

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

因此,当脚本从 file1 中读取“#”时,它会将其更改为 “%23”。有 174 个不同的字符需要识别,所以如果 陈述是不可行的。

注意:我写的是bash

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

有什么建议吗?

【问题讨论】:

  • 使用已经拥有处理 URL 编码的库的语言。
  • 请包含您输入文件的正确示例,以及您期望的输出和您迄今为止编写的代码。如果该代码达到产生输出的程度,请也包括在内。这里的人们很乐意提供帮助,但更好的问题是依赖于更好的答案。
  • 是的,对 chepner 的评论 +1。虽然我怀疑您的建议可以 完成,但另一个问题是它是否应该 完成。听起来你好像在重新发明一个轮子来支持XY Problem

标签: bash awk sed


【解决方案1】:
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 条目相关)未保留,因此如果在早期翻译结果中使用字符,如 -&gt; %20% 之后,可能会出现一些不需要的结果-> Percent 将给 Percent20 一个原始的

【讨论】:

  • 确保您可以控制替换顺序,如果您先将#替换为%23,然后将%替换为%25,您将得到%2523。
  • 好点,OP 应该指定想要的行为。如果顺序很重要,我们应该使用 2 个数组而不是 1 个数组,并通过索引管理顺序
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2015-09-23
  • 2013-09-07
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多