如何在 bash 中使用正则表达式转换分隔符



如何修改我的 bash 文件以达到如下所示的预期结果?

#!/bin/bash
filename=$1
var="$(<$filename)" | tr -d 'n'
sed -i 's/;/,/g' $var

转换此输入文件

a,b;c^d"e}
f;g,h!;i8j-

到此输出文件

a,b,c,d,e,f,g,h,i,j 

如何在 bash 中使用正则表达式转换分隔符

从字面上看,你会这样做 - 使用正则表达式转换任何分隔符。这包括以下步骤:

  • 最重要的是,弄清楚"分隔符"的确切定义
  • 为其编写正则表达式
  • 为其编写算法
  • 运行和测试代码

例如,假设分隔符是n,;^"}!8-字符中的任何一个序列,您可以执行以下操作:

sed -zi 's/[,;^"}!8-]+/,/g; s/,$/n/' input_file

或者类似于第一个tr 'n' ,,例如,当-z不适用于您的 sed 时,然后将tr的结果传递给 sed。第二个正则表达式在输出上添加一个尾随换行符,而不是尾随,

此外,在您的代码中:

  • var未设置sed行上。管道|部分在子外壳中运行。
  • var=$(<$filename)包含文件的内容,而sed需要文件名作为参数,而不是文件内容。
  • var=.... | ...正在将分配结果通过管道传输到tr。赋值的输出为空,因此该行不产生任何内容,并且其输出未使用。

请记住使用 shellcheck 检查 bash 脚本。

对于一个有点便携的解决方案,也许可以尝试

tr -cs A-Za-z , <input_file | sed '$s/,$/n/' >output_file

使用n强制使用最终换行符仍然不完全可靠;有一些sed版本将序列解释为文字n

如果要替换原始命令,请将output_file移回此命令之后input_file顶部。

最新更新