使用 bash 删除字符串中特定出现后的所有文本

Posted

技术标签:

【中文标题】使用 bash 删除字符串中特定出现后的所有文本【英文标题】:Delete all text after a specific occurrence in a string using bash 【发布时间】:2021-12-10 23:02:45 【问题描述】:

我有一个序列:

MALYYDHQIEAPDAAGSPSFISWHPVHPFLAVAYISTTSTGSVDIYLEQGECVPDTHVERPFRVASLCWHPTRLVLAVGWETGEVTVFNKQDKEQHTMPLTHTADITVLRWSPSGNCLLSGDRLGVLLLWRLDQRGRVQGTPLLKHEYGKHLTHCIFRLPPPGEDLVQLAKAAVSGDEKALDMFNWKKSSSGSLLKMGSHEGLLFFVSLMDGTVHYVDEKGKTTQVVSADSTIQMLFYMEKREALVVVTENLRLSLYTVPPEGKAEEVMKVKLSGKTGRRADIALIEGSLLVMAVGEAALRFWDIERGENYILSPDEKFGFEKGENMNCVCYCKVKGLLAAGTDRGRVAMWRKVPDFLGSPGAEGKDRWALQTPTELQGNITQIQWGSRKNLLAVNSVISVAILSERAMSSHFHQQVAAMQVSPSLLNVCFLSTGVAHSLRTDMHISGVFATKDAVAVWNGRQVAIFELSGAAIRSAGTFLCETPVLAMHEENVYTVESNRVQVRTWQGTVKQLLLFSETEGNPCFLDICGNFLVVGTDLAHFKSFDLSRREAKAHCSCRSLAELVPGVGGIASLRCSSSGSTISILPSKADNSPDSKICFYDVEMDTVTVFDFKTGQIDRRETLSFNEQETNKSHLFVDEGLKNYVPVNHFWDQSEPRLFVCEAVQETPRSQPQSANGQPQDGRAGPAADVLILSFFISEEHGFLLHESFPRPATSHSLLGMEVPYYYFTRKPEEADREDEVEPGCHHIPQMVSRRPLRDFVGLEDCDKATRDAMLHFSFFVTIGDMDEAFKSIKLIKSEAVWENMARMCVKTQRLDVAKVCLGNMGHARGARALREAEQEPELEARVAVLATQLGMLEDAEQLYRKCKRHDLLNKFYQAAGRWQEALQVAEHHDRVHLRSTYHRYAGHLEASADCSRALSYYEKSDTHRFEVPRMLSEDLPSLELYVNKMKDKTLWRWWAQYLESQGEMDAALHYYELARDHFSLVRIHCFQGNV QKAAQIANETGNLAASYHLARQYESQEEVGQAVHFYTRAQAFKNAIRLCKENGLDDQLMNLALLSSPEDMIEAARYYEEKGVQMDRAVMLYHKAGHFSKALELAFATQQFVALQLIAEDLDETSDPALLARCSDFFIEHSQYERAVELLLAARKYQEALQLCLGQNMSITEEMAEKMTVAKDSSDLPEESRRELLEQIADCCMRQGSYHLATKKYTQAGNKLKAMRALLKSGDTEKITFFASVSRQKEIYIMAANYLQSLDWRKEPEIMKNIIGFYTKGRALDLLAGFYDACAQVEIDEYQNYDKAHGALTEAYKCLAKAKAKSPLDQETRLAQLQSRMALVKRFIQARRTYTEDPKESIKQCELLLEEPDLDSTIRIGDVYGFLVEHYVRKEEYQTAYRFLEEMRRRLPLANMSYYVSPQAVDAVHRGLGLPLPRTVPEQVRHNSMEDARELDEEVVEEADDDP P>

我想将索引位置 383 (Q) 替换为后面的任何内容,因此期望的结果是:

MALYYDHQIEAPDAAGSPSFISWHPVHPFLAVAYISTTSTGSVDIYLEQGECVPDTHVERPFRVASLCWHPTRLVLAVGWETGEVTVFNKQDKEQHTMPLTHTADITVLRWSPSGNCLLSGDRLGVLLLWRLDQRGRVQGTPLLKHEYGKHLTHCIFRLPPPGEDLVQLAKAAVSGDEKALDMFNWKKSSSGSLLKMGSHEGLLFFVSLMDGTVHYVDEKGKTTQVVSADSTIQMLFYMEKREALVVVTENLRLSLYTVPPEGKAEEVMKVKLSGKTGRRADIALIEGSLLVMAVGEAALRFWDIERGENYILSPDEKFGFEKGENMNCVCYCKVKGLLAAGTDRGRVAMWRKVPDFLGSPGAEGKDRWALQTPTELQGNITQ P>

我试过了:

sed 's/"Q"//383' text.file
sed 's/Q//383' text.file

但这并没有任何作用。

从长远来看,我需要处理一些其他职位,因此非常感谢一种灵活的方法。

一切顺利

【问题讨论】:

awk 中的简单 substr 可以在这里使用,例如:awk 'print substr($0,1,383)' Input_file sed 's/Q//383' text.file 提示 sed 删除第 383 次出现的 Q,因为只有 69 Qs 没有采取任何措施 请指定文件是否有任何类型的行分隔符,或者只是一长串大写字母。 【参考方案1】:

这可能对你有用(GNU sed):

sed -zEi 's/(.383).*/\1/' file

将前 383 个字符存储为反向引用并删除其余字符。

注意-z 选项将整个文件吞入内存。

【讨论】:

【参考方案2】:

你可以用 cut 来做到这一点:

cut -c 1-383 < text.file

【讨论】:

【参考方案3】:

GNU awk:

gawk 'print gensub(/(.383).*/,"\\1","1")' file

【讨论】:

【参考方案4】:

只是扔到池子里,head 可以在n 行之后截断,也可以在c 字节之后:

$ head -c 383 text.file

【讨论】:

【参考方案5】:

如果您将字符串存储在 bash 变量中,则可以使用 bash 参数扩展:

mystring=$(cat text.file)
echo "$mystring:0:383"

【讨论】:

【参考方案6】:

另一个选项:dd

dd if=txt.file bs=383 count=1 status=none

【讨论】:

【参考方案7】:

使用bashprintf

 printf '%.383s\n' $(<text.file)

【讨论】:

以上是关于使用 bash 删除字符串中特定出现后的所有文本的主要内容,如果未能解决你的问题,请参考以下文章

使用bash shell脚本从文件中查找和提取特定字符串后的值?

在bash中匹配单词后的一行中打印特定字符串[重复]

SQL Server替换,删除特定字符后的所有内容

如何删除所有出现的特定字符串一个字符串? [复制]

检查文本区域是不是包含符号并删除符号后的所有内容

Bash 字符串删除特定字符