2016-11-20 182 views
-1

我有一个文本文件。这个文件有5行5列。所有列由“|”分隔(符号)。在第二列(内容)长度应该是7个字符。Unix Shell脚本 - 如何删除文本文件中的特定字符?

如果第二列的长度超过7个字符。然后,我想在不打开该文件的情况下删除这些额外的字符。

例如:

cat file1 

FF | haha​​ha1 | kjbsb | 122344 | jbjbnjuinnv |

df | hadb123_udcvb | sbfuisdbvdkh | 122344 | jbjbnjuinnv |

gf | harayhe_jnbsnjv | sdbvdkh | 12234 | jbjbnj |

qq | kkksks2 | datetag | 7777 | jbjbnj |

jj | harisha | hagte | 090900 | hags |

对于上述情况,第二列长度的第二行和第三行超过7个字符。现在我想删除那些额外的字符,而无需使用awk或sed命令打开输入文件

我在等待你的回复。

在此先感谢!

+0

看到https://stackoverflow.com/editing-help,为了清晰起见添加预期输出效果更好,也可以https://stackoverflow.com/help – Sundeep

+2

如果不打开文件,则无法编辑文件。 –

+1

目前尚不清楚你的“没有打开输入文件”的要求意味着什么。为了读取输入文件,文件_必须被打开。如果你只是不想_overwrite_输入文件,你可以写入临时文件(如@ TomFenech的答案)。 – e0k

回答

2

径长度为7的子串从第二塔以AWK:

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 

即重定向到一个临时文件,然后覆盖原来的。

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