【问题标题】:Removing punctuation using sed使用 sed 删除标点符号
【发布时间】:2021-07-02 04:23:41
【问题描述】:

我正在尝试编写一个从文本文件中删除标点符号的脚本。

我尝试使用 sed,但我愿意接受其他建议(如 awk)

这是我目前的代码

declare -a marks=('\.' '\,' '\;' '\:')

for i in {0..3}
do
    sed -i 's/${marks[i]}//g' test.txt
done
cat test.txt`

我认为我的主要问题是没有正确使用转义键。

【问题讨论】:

  • sed 不会更改文件,它会输出新版本。单引号不插入变量。
  • @choroba 抱歉,我忘了添加 -i ,据我所知会更改文件。你能建议对变量插值的修复吗?
  • 第二点是:用单引号括起来时,${marks[i]} 不会被bash 扩展
  • 与其在循环中多次运行sed,不如使用一个包含所有要删除的字符的模式,或者从您的数组中创建一个模式。在您的示例中,sed 命令可以是 sed -i 's/[.,;:]//g' test.txt

标签: bash unix awk sed


【解决方案1】:

tr 命令非常适合:

tr -d '[:punct:]' < test.txt > tmp.txt && mv -f tmp.txt test.txt

-d 代表删除。

选择一个不存在的文件tmp.txt;生成临时文件的解决方案是mktemp -u

这是一个小脚本,用于删除作为参数传递的文件中的任何标点符号:

#! /bin/bash
t=$(mktemp -u)
for f ; do
    tr -d '[:punct:]' < "$f" > "$t" && mv -f "$t" "$f"
done

for ffor f in "$@" 的快捷方式,它会遍历每个参数而不进行分词。

【讨论】:

  • 当您需要用单个字符替换单个字符或删除单个字符时,如果有更好的解决方案,请使用 tr。荣誉。
  • 好奇:你为什么用-umktemp
  • 还有sponge来自moreutils
  • 我使用 '-u' 向mktemp 询问一个随机的临时路径而不创建文件,否则会立即被tr 覆盖。
【解决方案2】:

改用ed

printf "%s\n" 'g/[[:punct:]]/s/[[:punct:]]//g' w  | ed -s test.txt

从文件中删除所有标点符号并保存剩余的文本。

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 2012-06-25
    • 2011-05-14
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多