如果这是零,如何删除文件中所有字符串的第一个字符?
例如
我有文件
$ cat file
01111111 01222222 6666066
09999011 02222044 0743333
01000000 30000000 2222220
尝试使用 sed 命令输出:
$ sed 's/^0*\(.*\)/\1/' file
1111111 01222222 6666066
9999011 02222044 0743333
1000000 30000000 2222220
但这只会擦除第一列的零。
如何删除文件中第一个字符的所有零,例如输出:
1111111 1222222 6666066
9999011 2222044 743333
1000000 30000000 2222220
答案1
可以合理地假设文本中的字符串由空格分隔。如果是这样,则需要删除前面有空格的零:
sed 's/\([[:space:]]\)0/\1/g'
该\(...\)
构造保存了零之前的空格,并且\1
替换中调用了已保存的文本。
然后还要注意前导零:
sed -e 's/\([[:space:]]\)0/\1/g' -e 's/^0//'
顺便说一句,你的例子没有擦除非初始零点,但取代用空白代替。我的解决方案假设擦除。
此外,您替换前导零的解决方案实际上替换了整个前导零序列。但是,您的问题要求第一的零将被抹去。这就是我的解决方案。
答案2
Perl 对于这个很方便:
perl -lape 's/\b(0+)/" " x length($1)/ge' file
1111111 1222222 6666066
9999011 2222044 743333
1000000 30000000 2222220
或者,在 awk 中等效
awk '{while (1) if (gsub(/\<0/, " ", $0) == 0) break; print}' file
这两者都会将“0”或“00”(作为独立的单词)变成空格。
如果你有
$ cat file
01111111 01222222 6666066
09999011 02222044 0743333
01000000 30000000 2222220
00000007 00000009 0000000
然后,为了保留最后一行的零值,您可以:
$ perl -lape 's/\b(0+)(\d)/" " x length($1) . $2/ge' file
1111111 1222222 6666066
9999011 2222044 743333
1000000 30000000 2222220
7 9 0