我有一个有几行的文件。
我希望更新文件,同时确保文件每一行的最后一个可见字符是单引号'
。如果没有,那么我们应该在每行末尾添加单引号。
如果单引号是一行中的最后一个字符,则保持原样。
猫测试.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'