我有一个文本文件。该文件有5行5列。所有列都以" |"分隔。 (符号)。在第二列(内容)长度应为7个字符。
如果第二列长度超过7个字符。然后,我想在不打开该文件的情况下删除那些额外的字符。
例如:
cat file1
FF | hahaha1 | kjbsb | 122344 | jbjbnjuinnv |
DF | hadb123_udcvb | sbfuisdbvdkh | 122344 | jbjbnjuinnv |
GF | harayhe_jnbsnjv | sdbvdkh | 12234 | jbjbnj |
QQ | kkksks2 | datetag | 7777 | jbjbnj |
JJ | harisha | hagte | 090900 |女巫|
对于上述情况,具有第二列长度的第二行和第三行超过7个字符。现在我想删除那些额外的字符而不使用awk或sed命令打开输入文件
我等着你的回答。
提前致谢!!
答案 0 :(得分:2)
使用awk:
从第二列获取长度为7的子字符串awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file
现在任何超过7个字符的字符串都会缩短。任何较短的字符串都会保留原样。
最后的1
是最短的 true 条件,可触发默认操作{ print }
。
如果您对更改感到满意,那么您可以像这样覆盖原始文件:
awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file > tmp && mv tmp file
即。重定向到临时文件,然后覆盖原始文件。
答案 1 :(得分:0)
首先尝试
sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1
这里发生了什么?我们一步一步地构建命令:
# Replace something
sed 's/hadb123_udcvb/replaced/' file1
# Remember the matched string (will be used in a later command)
sed 's/\(hadb123_udcvb\)/replaced/' file1
# Replace a most 7 characters without a '|' (one time each line)
sed 's/\([^|]\{7\}\)/replaced/' file1
# Remove additional character until a '|'
sed 's/\([^|]\{7\}\)[^|]*/replaced/' file1
# Put back the string you remembered
sed 's/\([^|]\{7\}\)[^|]*/\1/' file1
# Extend teh matched string with Start-of-line (^), any-length first field, '|'
sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1
当显示所需的输出时,您可以添加选项-i
以更改输入文件:
sed -i 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1