使用 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
Q
s 没有采取任何措施
请指定文件是否有任何类型的行分隔符,或者只是一长串大写字母。
【参考方案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】:使用bash
和printf
:
printf '%.383s\n' $(<text.file)
【讨论】:
以上是关于使用 bash 删除字符串中特定出现后的所有文本的主要内容,如果未能解决你的问题,请参考以下文章