Bash + sed / awk / cut删除第n个字符

时间:2018-03-14 14:27:53

标签: bash awk sed

我试图删除每行的第6,7和8个字符。

以下是包含文字格式的文件。

实际输出..

#cat test 
18:40:12,172.16.70.217,UP
18:42:15,172.16.70.218,DOWN

在格式化后期望下面。

#cat test
18:40,172.16.70.217,UP
18:42,172.16.70.218,DOWN

即使我尝试过以下,也没有运气

#awk -F ":" '{print $1":"$2","$3}' test
18:40,12,172.16.70.217,UP

#sed 's/^\(.\{7\}\).\(.*\)/\1\2/' test  { Here I can remove only one character }
18:40:1,172.16.70.217,UP

即使裁员也失败

#cut -d ":" -f1,2,3 test
18:40:12,172.16.70.217,UP

需要删除每一行中的字符,如第6,第7,第8

建议

6 个答案:

答案 0 :(得分:5)

使用GNU剪切,您可以使用--complement开关删除字符6到8:

cut --complement -c6-8 file

否则,您可以自己选择其余的角色:

cut -c1-5,9- file

即。字符1到5,然后9到每行的末尾。

使用awk你可以使用子串:

awk '{ print substr($0, 1, 5) substr($0, 9) }' file

或者您可以编写正则表达式,但结果会更复杂。

例如,要从第一个以逗号分隔的字段中删除最后三个字符:

awk -F, -v OFS=, '{ sub(/...$/, "", $1) } 1' file

或者,将sed与捕获组一起使用:

sed -E 's/(.{5}).{3}/\1/' file

捕获前5个字符并在替换中使用它们,然后删除下一个3。

答案 1 :(得分:3)

它是一个结构化的文本,如果你可以描述它们,为什么要计算这些字符?

$ awk '{sub(":..,",",")}1' file

18:40,172.16.70.217,UP
18:42,172.16.70.218,DOWN

删除秒。

答案 2 :(得分:2)

以下解决方案是通用的,并且不承担任何格式的知识。他们只删除任何一行的字符6,7和8。

<强> const applicant = result.applicant || {} if (applicant_id !== `${applicant._id}`) { console.log('redirect user'); }

sed
  

sed 's/.//8;s/.//7;s/.//6' <file> # from high to low sed 's/.//6;s/.//6;s/.//6' <file> # from low to high (subtract 1) sed 's/\(.....\).../\1/' <file> sed 's/\(.{5}\).../\1/' <file> ::将s/BRE/replacement/n n替换为BRE

<强> replacement

awk

这是相同的3倍,删除字段分隔符awk 'BEGIN{OFS=FS=""}{$6=$7=$8="";print $0}' <file> awk -F "" '{OFS=$6=$7=$8="";print}' <file> awk -F "" '{OFS=$6=$7=$8=""}1' <file> FS假定字段为字符。我们清空字段awk6,7,并使用输出字段分隔符8重新打印该行,该分隔符为空。

<强> OFS

cut

答案 3 :(得分:2)

只是为了好玩,perl,你可以在其中分配一个子字符串

perl -pe 'substr($_,5,3)=""' file

答案 4 :(得分:0)

使用awk:

echo "18:40:12,172.16.70.217,UP" | awk '{ $0 = ( substr($0,1,5) substr($0,9) ) ; print $0}'

问候!

答案 5 :(得分:0)

如果你在bash上运行,你可以使用它的字符串操作功能,而不必调用awk,sed,cut或任何二进制文件:

while read STRING
do
  echo ${STRING:0:5}${STRING:9}
done < myfile.txt

$ {STRING:0:5}代表字符串的前五个字符,$ {STRING:9}代表第9个字符,所有剩余的字符代表该行的结尾。这样你就可以剪掉字符6,7和8 ......