如何修改我的 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
顶部。