【问题标题】:Remove specific words from a text file in bash从 bash 中的文本文件中删除特定单词
【发布时间】:2017-03-31 04:08:54
【问题描述】:

我想从 bash 中的 txt 文件中删除特定的单词。 这是我当前的脚本:

echo "Sequenzia Import Tag Sidecar Processor v0.2"
echo "=============================================================="
rootfol=$(pwd)
echo "Selecting files from current folder........"
images=$(ls *.jpg *.jpeg *.png *.gif)
echo "Converting sidecar files to folders........"
for file in $images
do
    split -l 8 "$file.txt" tags-
    for block in tags-*
    do
                foldername=$(cat "$rootfol/$block" | tr '\r\n' ' ')
                FOO_NO_EXTERNAL_SPACE="$(echo -e "${foldername}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
                mkdir "$FOO_NO_EXTERNAL_SPACE" > /dev/null
                cd "$FOO_NO_EXTERNAL_SPACE"
        done
        mv "$rootfol/$file" "$file"
        cd "$rootfol"
        rm tags-* $file.txt
done
echo "DONE! Move files to import folder"

它的作用是读取与图像命名相同的 txt 文件,并创建在导入到 Sequenzia 图像板(基于 myimoutobooru)(https://code.acr.moe/kazari/sequenzia)期间被解释为标签的文件夹。 我想要做的是从边车文件中删除特定的单词(实际上是符号组合),这样它们就不会导致导入过程出现问题。

我想从文件中删除像 ">_

考虑到我当前的脚本,我可以添加什么来允许我使用非法单词列表来执行此操作。

【问题讨论】:

  • 请提供更多详细信息,说明您尝试了什么以及为什么没有成功。

标签: bash debian


【解决方案1】:

您可以创建一个列出非法字符串的文件并遍历文件的行,使用正则表达式从您的输入中删除每个字符串,例如this

【讨论】:

  • 好吧,我不想删除所有符号,我想删除一个组合或单词列表,因为这会与文件的其他有效行混淆。
【解决方案2】:

在 "split -l 8 "$file.txt" tags-" 行之前,我建议您使用以下内容清理 $file.txt:

sef -f sedscript <"$file.txt" >tempfile

sedscript 是您预先创建的包含所有不需要的字符串的文件,例如

s/>_<//g
s/:o//g

您需要将拆分命令更改为使用 tempfile。

在我的 PC 上使用 stdin/stdout 进行实验表明 sed 脚本中的多个匹配项在输入文件的同一通道中执行。所以是文件很大,这种方法避免了多次读取文件。

这种方法的另一个变体是:

sed -e s/>_<//g -e s/:o//g <infile >outfile

重复

-e s/xxx//g

根据需要多次选择。

【讨论】:

  • 顺便说一下,这种脚本在 Perl 中可能更容易。 Perl 就是做这种事情的。 Bash 必须调用一堆外部程序,例如 sed。
  • 这似乎有点工作,当我运行它时,它似乎几乎删除了每个字符,只留下了几个字母。这是我的脚本code.acr.moe/kazari/sequenzia/snippets/2
  • 你快到了。 sed 脚本中的某些字符是“特殊的”,需要使用反斜杠进行转义。所以,如果你有 s/...//g 这将删除任何三个字符的序列 - 点是通配符。此链接有更多详细信息“unix.stackexchange.com/questions/32907/…”。
  • 总结:“Sed 使用基本的正则表达式。在 BRE 中,字符 $.*[]^ 需要在它们前面加上反斜杠来引用”。所以你的 sed 命令 s/...//g 需要是 s/\.\.\.//g 才能删除三个点。
  • 好吧,看起来无法完全测试它,因为 split 由于某种原因似乎没有输出任何东西,这是我当前的脚本code.acr.moe/kazari/sequenzia/snippets/3
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多