我有一些文本文件,其中包含一些由不同数量的空格分隔的列,但我需要一个制表符作为分隔符。可以在 Bash 中执行此操作吗?
答案1
转换序列多个空格到标签页,但是保留个人空间:
sed 's/ \+ /\t/g' inputfile > outputfile
对多个文件执行此操作:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
或者
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
或者
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
对于 MacOS,请使用此形式(或者只是为了避免+
在 Linux 中转义):
sed -E 's/ + /\t/g'
以及您从上面的示例中需要的其他选项等等。
答案2
如果您的角色有多个标签,您还可以使用tr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
例如:
my_file.txt | tr -s " "
所有空白处将合二为一。
答案3
您可以使用sed
制表符替换多个空格:
用一个制表符替换一个或多个空格的示例:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
答案4
最简单的答案bash
是:
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
如果列数可变,您可以这样做,但它只在 中起作用bash
,而不是sh
:
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
例如
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
生成:
a b c
d e f
g h i
(每个之间都有一个标签,但是当我将其粘贴到这里时很难看见)
您也可以使用sed
或来完成此操作tr
,但请注意,开始时的空白处理会产生不同的结果。
sed:
$ sed 's/ */\t/g' << EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
tr:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i