我有一个文本文件,行前有一个空格。如何使用tr
(或正确的命令)删除它?
例如,我有这个:
Text
我想要这个:
Text
但是,我该如何处理 200 行的文本文件呢?
我目前有这个管道:
cat file.txt | tr -s " " | tr -d ","
其他tr
命令用于删除文本文件的其他方面。
答案1
这应该可以完成这项工作:
sed -e 's/^ //' -e 's/,//g' file.txt
向命令sed
(流编辑器)传递两个命令以按顺序执行,两个命令都用无替代有,即删除一部分输入。
第一个命令删除行首后面的空格,注意^
,第二个命令删除逗号,其效果与你的tr -d ","
命令完全相同。
感谢 minerz029 间接提醒我,我漏掉了“g”,因为我的第一个回复只是删除了每行中第一个逗号。
答案2
sed -e 's/^ //g' -e 's/,//g' file.txt
解释:
第一个脚本 ( s/^ //g
) 是将所有前导空格替换为空(删除)。
第二个脚本 ( s/,//g
) 是将所有逗号替换为空(删除)。
答案3
Bash 有一种使用while IFS= read -r ; do . . . done < input.txt
结构 来打印文件确切内容的方法,但这里的一个特殊功能是,如果省略IFS=
,则不会读取前导空格。因此,我们可以执行以下操作:
$ cat input.txt
Text
$ while read -r line; do printf "%s\n" "$line"; done < input.txt
Text
要替换原始文件的文本,可以稍微修改命令,如下所示:
$ cat input.txt
Text
$ while read -r line; do printf "%s\n" "$line"; done < input.txt > temp.txt ; mv temp.txt input.txt
$ cat input.txt
Text
我们也可以使用参数扩展来删除逗号
$ cat input.txt
Text, text,
$ while read -r line; do printf "%s\n" "${line//,}"; done < input.txt
Text text
tr -s" "
printf
也可以通过稍微修改来模拟
$ cat input.txt
Text, text,
$ while read -r line; do printf "%s " ${line//,};printf "\n"; done < input.txt
Text text