【问题标题】:Shell script to add a full stop at the end of each line (that do not contain a full stop) in a file用于在文件中的每一行(不包含句号)的末尾添加句号的 Shell 脚本
【发布时间】:2020-02-16 16:26:29
【问题描述】:

我有一个文件,每行一个句子,例如

Random stuff,
"First sentence",
"second sentence.",
"Third sentence!"
More Random Stuff,

等等……

我只想就地修改引用的行,即上面示例中的第 2、第 3 和第 4 行。

我想做以下修改 -

  1. 在行尾添加句号(如果没有句号或感叹号)
  2. 将第一个字符设为大写(如果尚未大写)

我尝试了以下解决方案来添加句号 -

sed -i 's/[^!.]",/.",/g' $file

上述命令将句子的最后一个字符删除为-

"First sentenc.",

如果我尝试以下命令 -

sed -i 's/[^!.]",/&.",/g' $file

我得到如下结果 -

"First sentence",.",

我想要的输出是 -

"First sentence.",

如何正确解决此问题而不会出现如上所示的不良结果? 另外,我怎样才能使第一个字符大写?

修改后的文件应该是-

Random stuff,
"First sentence.",
"Second sentence.",
"Third sentence!"
More Random Stuff,

【问题讨论】:

  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 嗨@Cyrus,我已经添加了我想要的输出。我一开始忘记添加了。
  • sed 's/^"[[:lower:]]/\u&/;s/\([^.!]\)",/\1.",/' file??
  • @oguzismail 我认为需要进行较小的更正: sed 's/^"[[:lower:]]/\U&\E/;s/([^.!])",/\ 1.",/'文件。匹配的区域包括前导引号。需要将引号和's'都大写。
  • @dash-o 我一个字都不懂

标签: regex shell unix sed scripting


【解决方案1】:

这可能对你有用(GNU sed):

sed -E '/^".*",/{s/[[:alpha:]]/\U&/;s/([^!?.])",$/\1.",/}' file

只关注引用的行。如果不是感叹号/问号或句号,则将第一个字母字符大写并在结束引号之前插入句点。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多