如何确保文件每行的最后一个字符以单引号字符结尾

如何确保文件每行的最后一个字符以单引号字符结尾

我有一个有几行的文件。

我希望更新文件,同时确保文件每一行的最后一个可见字符是单引号'。如果没有,那么我们应该在每行末尾添加单引号。

如果单引号是一行中的最后一个字符,则保持原样。

猫测试.txt

fahsjhjkhkjhjhajkhjf
afasfsfsfffsfasf'
aaffa' sfff
wfafsfsaffs'
fsafsfs'afffafsasf

预期输出:

fahsjhjkhkjhjhajkhjf'
afasfsfsfffsfasf'
aaffa' sfff'
wfafsfsaffs'
fsafsfs'afffafsasf'

答案1

sed表达式s/[^']$/&'/会在任何以非单引号字符结尾的行的末尾插入单引号。

在外壳中:

sed "s/[^']$/&'/" file

由于表达式包含单引号,因此我选择将表达式写在双引号中。要进行就地编辑,请使用sed-i选项(如果它完全实现了此非标准选项)。

要在空行上插入单引号,您可以使用专门针对空行的额外表达式,或者您可以总是在行尾插入单引号,然后替换由此产生的任何双单引号。

即,要么

sed -e "s/[^']$/&'/" -e "/^$/s//'/" file

或者

sed -e "s/$/'/" -e "s/''$/'/" file

答案2

如果匹配单引号是否存在,并且如果存在,替换它是可以接受的,那么你可以尝试这个sed

$ sed "s/\([^']*\)'\?$/\1'/" input_file
'fahsjhjkhkjhjhajkhjf'
afasfsfsfffsfasf'
aaffa' sfff'
wfafsfsaffs'
fsafsfs'afffafsasf'

这使用反向引用来捕获直到行尾的每个字符。如果在行尾找到单引号,则通过将单引号放在捕获括号之外来排除/删除它。

然后,括号内捕获的所有内容都会返回,\1并将单引号硬编码到每行末尾。

答案3

类似的东西可以完成这项工作:

awk -v a=\' '{print $0 a}'  input.file

如果您想避免在末尾使用双引号,您可以尝试以下操作:

 awk -v a=\' '{print $0 a}'  input.file|sed "s/''$/'/"

答案4

假设您希望空输入行出现'在输出中,并且输入希望foo''输出为foo'

$ sed "s/'*$/'/" file
fahsjhjkhkjhjhajkhjf'
afasfsfsfffsfasf'
aaffa' sfff'
wfafsfsaffs'
fsafsfs'afffafsasf'

相关内容