Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 是否将制表符更改为分号?_Shell - Fatal编程技术网

Shell 是否将制表符更改为分号?

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

我有一个文件,第一个字段后需要一个分号分隔符,长度为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

有人知道怎么做吗?谢谢大家!

在你的问题中加入样本数据和输出确实很有帮助,但是根据你所说的,下面的方法可以奏效

# 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。谢谢!:-)