【问题标题】:linux/bash: remove text between two charslinux/bash:删除两个字符之间的文本
【发布时间】:2014-04-26 10:00:17
【问题描述】:

我有一个文件file1,它包含:

<     16 ./lnx/apps/vlc/tsconf_1.0-11_all.deb
<     16 ./lnx/apps/vlc/vlc
<   2000 ./lnx/apps/vlc/vlc-nox_2.0.8-1_i386.deb
<     16 ./lnx/apps/vlc/vlc-plugin-notify_2.0.8-1_i386.deb
<     32 ./lnx/apps/vlc/vlc-plugin-pulse_2.0.8-1_i386.deb
<     16 ./lnx/cmds/64bit_ubuntu_add_i386
<     16 ./lnx/cmds/acroread_dl
<     16 ./lnx/cmds/dl_from_gdrv
<     16 ./lnx/cmds/dpkg_install_list_in_txt_file
<     16 ./lnx/cmds/find_and_replace
<     16 ./lnx/cmd/pearl_script.ps1
<     16 ./lnx/cmds/rm_using_find
<     16 ./lnx/cmds/wget_dl_whl_ws

我想删除&lt;./(或\n./ 之间)之间的所有内容,不包括./,因此输出如下:

./lnx/apps/vlc/tsconf_1.0-11_all.deb
./lnx/apps/vlc/vlc
./lnx/apps/vlc/vlc-nox_2.0.8-1_i386.deb
./lnx/apps/vlc/vlc-plugin-notify_2.0.8-1_i386.deb
./lnx/apps/vlc/vlc-plugin-pulse_2.0.8-1_i386.deb
./lnx/cmds/64bit_ubuntu_add_i386
./lnx/cmds/acroread_dl
./lnx/cmds/dl_from_gdrv
./lnx/cmds/dpkg_install_list_in_txt_file
./lnx/cmds/find_and_replace
./lnx/cmd/pearl_script.ps1
./lnx/cmds/rm_using_find
./lnx/cmds/wget_dl_whl_ws

我尝试了这些命令(它们的输出是准确的输入文件):

$ sed -n '/</,/ ./ p' file1
$ sed 's/< .* " ."/./' file1
$ sed -e 's/<\n[^ .]>/<\n.>/g' file1
$ sed -e 's/\(<\).*\(.\)/\1\2/' file1

可能这只是一件简单的事情,但我是 sed/awk/tr/grep/find 命令的新手。

【问题讨论】:

    标签: bash replace sed awk tr


    【解决方案1】:

    您可以使用 BASH 正则表达式匹配。

    while read -r; do
        [[ $REPLY =~ .*(\.\/.*) ]] && echo ${BASH_REMATCH[1]}
    done < file
    

    【讨论】:

      【解决方案2】:

      重击

      while read -r _ _ file_details; do
        echo "$file_details"
      done < your_file > your_file.edited
      

      Awk

      awk '{ $1=""; $2=""; print; }'
      

      好的,如果那些第一个空格真的很烦人的话:

      awk -F. '{printf ".";print $2}'
      

      【讨论】:

      • bash 循环将解释反斜杠,因此将\t 转换为制表符,例如,第一个 awk 脚本将添加前导空格并压缩所有其他连续的空白,第二个 awk 脚本将替换每个路径中的每个空格都有一个换行符。
      • @EdMorton 已修复,谢谢。我让第二个 awk 保持不变,因为我从来没有打算让那个变得非常健壮,正如您从我的评论中看出的那样。
      【解决方案3】:

      怎么样(或者我错过了什么):

      $ awk '$0=$NF' file
      ./lnx/apps/vlc/tsconf_1.0-11_all.deb
      ./lnx/apps/vlc/vlc
      ./lnx/apps/vlc/vlc-nox_2.0.8-1_i386.deb
      ./lnx/apps/vlc/vlc-plugin-notify_2.0.8-1_i386.deb
      ./lnx/apps/vlc/vlc-plugin-pulse_2.0.8-1_i386.deb
      ./lnx/cmds/64bit_ubuntu_add_i386
      ./lnx/cmds/acroread_dl
      ./lnx/cmds/dl_from_gdrv
      ./lnx/cmds/dpkg_install_list_in_txt_file
      ./lnx/cmds/find_and_replace
      ./lnx/cmd/pearl_script.ps1
      ./lnx/cmds/rm_using_find
      ./lnx/cmds/wget_dl_whl_ws
      

      【讨论】:

      • 注意:如果您的文件和/或目录中有空格,则此将不起作用
      【解决方案4】:
      $ sed 's/[^.]*//' file
      ./lnx/apps/vlc/tsconf_1.0-11_all.deb
      ./lnx/apps/vlc/vlc
      ./lnx/apps/vlc/vlc-nox_2.0.8-1_i386.deb
      ./lnx/apps/vlc/vlc-plugin-notify_2.0.8-1_i386.deb
      ./lnx/apps/vlc/vlc-plugin-pulse_2.0.8-1_i386.deb
      ./lnx/cmds/64bit_ubuntu_add_i386
      ./lnx/cmds/acroread_dl
      ./lnx/cmds/dl_from_gdrv
      ./lnx/cmds/dpkg_install_list_in_txt_file
      ./lnx/cmds/find_and_replace
      ./lnx/cmd/pearl_script.ps1
      ./lnx/cmds/rm_using_find
      ./lnx/cmds/wget_dl_whl_ws
      

      【讨论】:

      • 谢谢你,埃德。这个 cmd 就是我想要的。我看到你是伟大的程序员,因为你对我的问题的 5 个答案中的 2 个发表了评论,甚至是第一个回答它的人 :)
      【解决方案5】:

      使用 sed:

      sed -i.bak 's~^<.*[[:space:]]\(\./\)~\1~' file
      

      sed -i.bak 's~^<[^.]*\(\./\)~\1~' file
      
      ./lnx/apps/vlc/tsconf_1.0-11_all.deb
      ./lnx/apps/vlc/vlc
      ./lnx/apps/vlc/vlc-nox_2.0.8-1_i386.deb
      ./lnx/apps/vlc/vlc-plugin-notify_2.0.8-1_i386.deb
      ./lnx/apps/vlc/vlc-plugin-pulse_2.0.8-1_i386.deb
      ./lnx/cmds/64bit_ubuntu_add_i386
      ./lnx/cmds/acroread_dl
      ./lnx/cmds/dl_from_gdrv
      ./lnx/cmds/dpkg_install_list_in_txt_file
      ./lnx/cmds/find_and_replace
      ./lnx/cmd/pearl_script.ps1
      ./lnx/cmds/rm_using_find
      ./lnx/cmds/wget_dl_whl_ws
      

      假设没有以&lt;space&gt;. 结尾的目录。

      【讨论】:

      • 这可能没问题,但值得一提的是,如果任何目录名称以. 结尾,它就会失败。将 .* 更改为 [^.]* 应该会删除该约束。
      • 谢谢 Ed,我让它更精确了一点。
      猜你喜欢
      • 2019-01-24
      • 2022-11-25
      • 2015-11-10
      • 1970-01-01
      • 2017-12-04
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多