Shell 是否将制表符更改为分号?
我有一个文件,第一个字段后需要一个分号分隔符,长度为4或5个字符。我尝试使用sed(修改了我找到的sed脚本),但失败了,它在每个字符之间插入了分号。我只需要在第一个字段的末尾添加一个分号 以下是一些示例文本:Shell 是否将制表符更改为分号?,shell,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 2FA1
2A19 kRSUnicode 205.8
2FA1A kRSUnicode 206.2
2FA1B kRSUnicode 207.5
我希望的结果是:
2A19; kRSUnicode 205.8
2FA1A; kRSUnicode 206.2
2FA1B; kRSUnicode 207.5
有人知道怎么做吗?谢谢大家! 在你的问题中加入样本数据和输出确实很有帮助,但是根据你所说的,下面的方法可以奏效
# 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
或者如果您将Linux与GNU一起使用
sed -i 's/ /;/' 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
您可以为每一行循环下面的命令
echo“abcde我是个好孩子”| sed-e的//:/“
制表符和空格称为空白。这将用分号替换空白的第一个字符:
sed 's/[[:space:]]/;/'
# or
sed 's/[[:space:]]/; /' # preserves the space char.
sed 's/[[:space:]]\{1,\}/;/'
sed 's/[[:space:]]\{1,\}/;/g'
# or
tr '\t ' ';'
这将用分号替换所有空白的第一个实例:
sed 's/[[:space:]]/;/'
# or
sed 's/[[:space:]]/; /' # preserves the space char.
sed 's/[[:space:]]\{1,\}/;/'
sed 's/[[:space:]]\{1,\}/;/g'
# or
tr '\t ' ';'
这将用分号替换所有空格实例:
sed 's/[[:space:]]/;/'
# or
sed 's/[[:space:]]/; /' # preserves the space char.
sed 's/[[:space:]]\{1,\}/;/'
sed 's/[[:space:]]\{1,\}/;/g'
# or
tr '\t ' ';'
更新
如果你不在乎分号之后的任何事情,那么这对于awk
$ awk '$0=$1";"' infile
2A19;
2FA1A;
2FA1B;
awk '$1=$1";"' OFS='\t' infile
这对于awk
$ awk '$0=$1";"' infile
2A19;
2FA1A;
2FA1B;
awk '$1=$1";"' OFS='\t' infile
输出
以下是一个仅限shell的方法:
第一个分隔符空格是制表符还是可变数量的空格还不是100%清楚,所以我只是使用echo将它们全部压缩到一个空格中
FILE="tmpfile"
OUTPUT=""
while read LINE || [ "$LINE" ]; do
LINE=`echo $LINE`
OUTPUT="${OUTPUT}${LINE/ /; }
"
done < "${FILE}"
echo "${OUTPUT}" > "${FILE}"
FILE=“tmpfile”
OUTPUT=“”
读第| |[“$LINE”];做
LINE=`echo$LINE`
OUTPUT=“${OUTPUT}${LINE//;}”
"
完成<“${FILE}”
回显“${OUTPUT}”>“${FILE}”
或者,如果它实际上是单个选项卡,只需:
...
while read LINE || [ "$LINE" ]; do
OUTPUT="${OUTPUT}${LINE/ /; }
"
done < "${FILE}"
...
。。。
读第| |[“$LINE”];做
OUTPUT=“${OUTPUT}${LINE//;}”
"
完成<“${FILE}”
...
根据您的建议,我添加了一些代码示例,并注意到它根本不是一个空格,而是一个标签字符!所以你好心提供的sed脚本不起作用;然而,你让我充满希望,这并不特别困难。我只需要在第一项中添加一个分号。我将删除行的其余部分,因此分号后面的内容无关紧要。就第一部分。@user1149499,这显然是一个重要的要求——请编辑您的问题,将其包括在内。根据OP下面的评论,“我将删除行的其余部分,这样分号后面的内容就不重要了。”您可以使用以下命令完成整个任务:awk'$1=$1;“{print$1}”of s='\t'infileWorked。谢谢!:-)