【问题标题】:Deleting everything between two string matches in a file删除文件中两个字符串匹配项之间的所有内容
【发布时间】:2021-10-13 06:50:27
【问题描述】:

我在 file.txt 中得到了这个文本:

Osmun.Prez@mail.com:c7lB2m6b@3.a.a:tt_webid_v2=6990226111024612869; tt_webid=6990226111024612869; tt_csrf_token=VD5Nb_TQFH4RKhoJeSe2nzLB; R6kq3TV7=AHkh4PB6AQAA3LIS90nWf2ss0Q7ZTCQjUat4axctvhQY68DdUEz92RwpmVSX|1|0|e9d6917c2fe555827dcf5ee916ba9778079ab2a9; ttwid=1%7CAFodeNF0iZM2fyy-ZeiZ6HTpZoG_MSx6SmXHgGVQ-V4%7C1627538859%7C59ca1e4a56f9f537b55e655a6dabff88e44eb48502b164ed6b4199f5a5263cb0; passport_csrf_token_default=6f7653c3ce946a6ce5444723fb0c509b; passport_csrf_token=6f7653c3ce946a6ce5444723fb0c509b; sid_guard=0483b7d37f4e4bd20ab3046e29724798%7C1627538893%7C5184000%7CMon%2C+27-Sep-2021+06%3A08%3A13+GMT; uid_tt=27b52febe6222486b9f6b6a90ef4ffeace5ea25c09d29a1583be5a1ecf760996; uid_tt_ss=27b52febe6222486b9f6b6a90ef4ffeace5ea25c09d29a1583be5a1ecf760996; sid_tt=0483b7d37f4e4bd20ab3046e29724798; sessionid=0483b7d37f4e4bd20ab3046e29724798; sessionid_ss=0483b7d37f4e4bd20ab3046e29724798; store-idc=maliva; store-country-code=us; odin_tt=294845c8f7711db177f7c549a9f44edb1555031b27a2a485df809cd92c4e544ac0772bf462df5b7a100f6e488c45303cd62df3b6b950f0842520cd887850137b035d990f29cc8b752765e594560c977f; cmpl_token=AgQQAPNSF-RMpbE89z5HYF0_-2PcrxjXf4fZYP5_ZA

如何使用bash linux 删除file.txt 中:tt__ZAstring 内部(第一个和唯一实例)的所有内容,仅保留Osmun.Prez@mail.com:c7lB2m6b@3.a.a? 谢谢

【问题讨论】:

  • 最好告诉我们您迄今为止为解决自己的问题所做的尝试。

标签: regex linux string bash shell


【解决方案1】:

类似:

sed -i "s/:tt_.*//" file.txt

如果您想就地编辑文件。如果没有,请移除 -i 开关。 sed 命令的意思是:替换(s),在file.txt 的每一行中,所有以模式:tt_ 开头的字符(.*)用一个空字符串(// )。

或者命令:

sed -i "s/:tt_.*_ZA//" file.txt

这更符合您的要求,但返回相同的输出。

【讨论】:

  • 这将留下最初的尾随:
  • io.popen("sed -i 's/:tt_.*//' file.txt") 这对我有用!非常感谢你!
【解决方案2】:

使用模式替换:

i=$(cat file.txt)
echo "${i/:tt*_ZA}"

【讨论】:

  • 您也可以使用cut -d: -f1-2 file.txt。按照功率最小的顺序:内置 > cut > sed > awk > perl >? nodejs/python/ruby.
【解决方案3】:

假设一般要求是删除第二个 : 之后的所有内容 ...

样本数据:

$ cat file.txt
Osmun.Prez@mail.com:c7lB2m6b@3.a.a:tt_webid_v ... to end of line
some.one@home.com:B52_m6b@9_az.more.stuff:delete from here ... to end of line

一个sed想法:

$ sed -En 's/^([^:]*:[^:]*).*$/\1/p' file.txt
Osmun.Prez@mail.com:c7lB2m6b@3.a.a
some.one@home.com:B52_m6b@9_az.more.stuff

【讨论】:

    【解决方案4】:

    使用awk

    awk 'BEGIN{FS=OFS=":"}{print $1,$2}'
    

    使用:作为分隔符,很容易提取:tt之前的列

    【讨论】:

      【解决方案5】:

      这会删除 file.txt 中从 ":tt_" 到最后一个 "_ZA" 的所有字符

      Mac_3.2.57$cat file.txt | sed 's/\(\)[:]tt.*_ZA\(.*\)/\1\2/'
      Osmun.Prez@mail.com:c7lB2m6b@3.a.a
      Mac_3.2.57$ 
      

      【讨论】:

        【解决方案6】:

        或者如果它总是用冒号分隔的前 2 个值(根据你的例子)

        猫文件.txt |剪切 -f1,2 -d':'

        【讨论】:

          猜你喜欢
          • 2020-06-30
          • 1970-01-01
          • 2021-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-22
          • 2011-01-25
          相关资源
          最近更新 更多