【问题标题】:Deleting multiple words from a file using terminal使用终端从文件中删除多个单词
【发布时间】:2014-06-09 19:14:39
【问题描述】:

我有一个单词列表word1 word2 word3,我想从文件file.txt 中删除它。我如何使用终端来做到这一点。

【问题讨论】:

  • sed -r -i 's/\bword1\b|\bword2\b|\bword3\b//g' file?
  • 尝试使用sed 将这些单词替换为空。
  • 使用sed 's/word1//g 并重复其他单词
  • @Floris 这不是一个好方法。说我要删除逮捕和逮捕。先申请逮捕命令再逮捕将在文件中留下“ed”。

标签: bash edit


【解决方案1】:

假设:

  • 只能对整个字进行替换,而不是任何子字符串。
  • 就地进行替换 - 即,应将结果写回输入文件。

  • GNU sed(改编自 @jaypal 的评论):

    sed -r -i 's/\b(word1|word2|word3)\b//g' file.txt
    
  • FreeBSD/OSX sed:

    sed -E -i '' 's/[[:<:]](word1|word2|word3)[[:>:]]//g' file.txt
    

如果搜索词可以是彼此的子字符串的变体解决方案:

# Array of sample search words.
words=( 'arrest' 'arrested' 'word3' )

# Sort them in reverse order and build up a list of alternatives
# for use with `sed` later ('word3|arrested|arrest').
# Note how the longer words among words that are substrings of
# each other come before the shorter ones.
reverseSortedAlternativesList=$(printf '%s\n' "${words[@]}" | sort -r  | tr '\n' '|')
# Remove the trailing '|'.
reverseSortedAlternativesList=${reverseSortedAlternativesList%|}

# GNU sed:
sed -r -i 's/\b('"$reverseSortedAlternativesList"')\b//g' file.txt

# FreeBSD/OSX sed:
sed -E -i '' 's/[[:<:]]('"$reverseSortedAlternativesList"')[[:>:]]//g' file.txt

【讨论】:

  • 如何将输出重定向到新文件而不是原地修改?
  • 删除-i选项(及其参数'',如果在FreeBSD/OSX上)并简单地附加&gt; out.txt以将输出重定向到文件out.txt;调整第一个 sn-p(类似地修改其他):sed -r 's/\b(word1|word2|word3)\b//g' file.txt &gt; out.txt
【解决方案2】:
cat file.txt | sed "s/word1//g" | sed "s/word2//g" 

如果要将内容写入新文件,请执行以下操作:

cat file.txt | sed "s/word1//g" | sed "s/word2//g" > newfile.txt

【讨论】:

  • 我如何确保如果 word1 是 word2 的子字符串,例如(1=arrest 和 2=arrested),那么如果文本包含被捕,那么它不会在文本中留下“ed”?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多