将标签更改为分号?

时间:2012-01-30 03:55:17

标签: shell

我有一个文件,在第一个字段后面需要一个分号分隔符,长度为4或5个字符。我尝试使用sed(修改了我发现的sed脚本),这是一个史诗般的失败......它在每个角色之间插入分号。我只需要在第一个字段的末尾添加一个分号。

以下是一些示例文字:

2A19    kRSUnicode  205.8
2FA1A   kRSUnicode  206.2
2FA1B   kRSUnicode  207.5

我希望的输出:

2A19;   kRSUnicode  205.8
2FA1A;  kRSUnicode  206.2
2FA1B;  kRSUnicode  207.5

任何人都知道如何做到这一点?谢谢!

6 个答案:

答案 0 :(得分:4)

选项卡和空格称为空格。这将用分号替换空白的第一个字符:

sed 's/[[:space:]]/;/'
# or
sed 's/[[:space:]]/; /' # preserves the space char. 

这将用分号替换所有空格的第一个实例:

sed 's/[[:space:]]\{1,\}/;/'

这将用分号替换所有空格实例:

sed 's/[[:space:]]\{1,\}/;/g'
# or
tr '\t ' ';'

答案 1 :(得分:2)

更新

如果您在分号后不关心任何事情,那么awk

甚至可以 更多 琐碎
$ awk '$0=$1";"' infile
2A19;
2FA1A;
2FA1B;

awk

这是微不足道的
awk '$1=$1";"' OFS='\t' infile

输出

$ awk '$1=$1";"' OFS='\t' infile
2A19;   kRSUnicode      205.8
2FA1A;  kRSUnicode      206.2
2FA1B;  kRSUnicode      207.5

答案 2 :(得分:0)

在您的问题中包含示例数据和输出确实很有帮助,但根据您所说的内容,以下内容将起作用

# replace the first space in a line with a semicolon.
printf    "sample data1, data2 data3\n" \
| sed 's/ /;/'

生成输出

sample;data1, data2 data3

您可以使用

处理您拥有的任何文件
sed 's/ /;/' file > newFile

或者如果你使用带有GNU sed的Linux

sed -i 's/ /;/' file

我希望这会有所帮助。

答案 3 :(得分:0)

更新

sed 's/\(\s\+\)/;\1/' file

根据输入数据,您可以匹配第一个标签并在其前面添加;

[jaypal:~/Temp] cat file
2A19    kRSUnicode  205.8
2FA1A   kRSUnicode  206.2
2FA1B   kRSUnicode  207.5

[jaypal:~/Temp] sed 's/\(\s\+\)/;\1/' file
2A19;    kRSUnicode  205.8
2FA1A;   kRSUnicode  206.2
2FA1B;   kRSUnicode  207.5

答案 4 :(得分:0)

你可以为每一行sed命令循环

echo "abcde I am a good boy" |sed -e 's/ /:/'

答案 5 :(得分:0)

这是一个仅限shell的方法: 关于第一个分隔符空间是一个制表符还是可变数量的空格并不是100%清楚,所以我只是使用echo将它们全部压缩到一个空格中

FILE="tmpfile"
OUTPUT=""
while read LINE || [ "$LINE" ]; do
    LINE=`echo $LINE`
OUTPUT="${OUTPUT}${LINE/ /; }
"
done < "${FILE}"
echo "${OUTPUT}" > "${FILE}"

或者如果它实际上只是一个标签,只需:

...
while read LINE || [ "$LINE" ]; do
    OUTPUT="${OUTPUT}${LINE/    /; }
"
done < "${FILE}"
...