0

我有固定长度的文件,比如

1234INen %^&           198787655
1234dnen %^& ($#       1987989809 

我只想用 * 替换这个特殊字符

我使用了 cut 命令,但它正在修剪字段之间的空格。

cut -c 5-10

如何在不更改输入格式和长度的情况下替换该特殊字符。

有人请建议使用 sed 命令进行替换

4

5 回答 5

1

你可以试试这个 sed 命令:

sed 's/[^a-zA-Z0-9 ]/*/g' file
1234INen ***           198787655
1234dnen *** ***       1987989809

更新:根据操作的评论:from length 9-16 i just want to replace with *

使用这个 sed:

sed -r 's/^(.{9}).{8}/\1********/g' file
1234INen ********      198787655
1234dnen ********      1987989809
于 2013-11-07T10:21:35.383 回答
0

只需删除您想要包含输出的所有内容,从而留下您不想要的内容。例如,要省略“列”5-10 中的字符,cut -c1-4,11-请使用 awk 并根据自己的喜好格式化输出,例如cut -c1-4,11- < your_file.txt | awk '{ f=$1 ; $1="" ; printf "%s %s\n", f, $0 }'(这将打印出第一个“列”,然后是几个空格,然后是其余的“列”) .

于 2013-11-07T09:48:29.610 回答
0
 sed "s/[[:punct:]]/*/g"

用于--posixGNU sed

于 2013-11-07T12:33:51.573 回答
0

如果输入在可预测的列中,则awk使用 FIELDWIDTHS 可能是要走的路。您可以通过以下方式轻松获得您所描述的内容:

awk '{$2="*"}1' FIELDWIDTHS='8 8 16' infile

输出:

1234INen *        198787655
1234dnen *        198798980

但是有很多额外的空白。也许足以打印第一个和最后一个字段?

awk '{print $1, "*", $NF}' infile

输出:

1234INen * 198787655
1234dnen * 1987989809
于 2013-11-07T12:40:09.933 回答
0

要删除不可打印的字符,你可以试试这个,前提是你有一个支持 POSIX 字符类的 sed(例如现代 Linux):

sed -r 's/[^[:print:]]//' input.file > final.file
于 2013-11-07T10:38:41.250 回答