【问题标题】:Delete all text after a specific occurrence in a string using bash使用 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 没有采取任何措施
  • 请指定文件是否有任何类型的行分隔符,或者只是一长串大写字母。

标签: string bash shell awk sed


【解决方案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)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-07-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-26
                • 1970-01-01
                相关资源
                最近更新 更多