我的目标是在文件的每一行中添加一个单引号,并跳过空行。
file.txt :
Quote1
Quote2
Quote3
到目前为止,我已使用sed:
sed -e "s/\(.*\)/'\1'/"
既可以执行此操作,又可以在空行中创建撇号:
'Quote1'
'Quote2'
''
'Quote3'
我的目标:
'Quote1'
'Quote2'
'Quote3'
我如何通过使用sed来实现这一目标,或者它应该是awk。
答案 0 :(得分:6)
.*
的意思是zero or more characters
,您希望1 or more characters
在任何sed中都是..*
:
$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
在使用.\+
调用时,您还可以在GNU sed中将正则表达式写为.\{1,\}
,在POSIX sed中将.+
写成,在GNU或OSX / BSD sed中将-E
写成。
以上假设所有空白行均应加引号。如果那是错误的,那么:
$ sed "s/.*[^[:blank:]].*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
在任何awk中,假设所有空白行都应加引号:
$ awk '/./{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'
'Quote3'
否则:
$ awk 'NF{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'
'Quote3'
您可以看到以上内容之间的区别:
$ printf ' \n' | sed "s/..*/'&'/"
' '
$ printf ' \n' | sed "s/.*[^[:blank:]].*/'&'/"
$ printf ' \n' | awk '/./{$0="\047" $0 "\047"}1'
' '
$ printf ' \n' | awk 'NF{$0="\047" $0 "\047"}1'
$
答案 1 :(得分:1)
一种方法:
awk '$1{$0 = q $0 q}1' q="'" file
仅在第一列($1
)具有某些值时才添加引号。 1
打印每一行。
答案 2 :(得分:1)
假设您要将单引号添加到除空格外仅包含以下行的行:
sed -E "/./s/(.*)/'\1'/"
答案 3 :(得分:1)
另一个sed
sed '/^$/!{s/^/\x27/;s/$/\x27/}' file
上面的脚本说
/^$/
-模式。!
)的行,请用单引号(^
)替换start($
)和end(\x27
) 。答案 4 :(得分:0)
您可以使用perl
来检查后面是否有否定字眼,断言您将不匹配“空”行:
perl -pe 's/(?<!$)(.*)/"\1"/' file
另一种选择是在正则表达式中更具体,如@edmorton在他的回答中建议的那样。
答案 5 :(得分:0)
在gnu sed上尝试
sed -E "s/\S+/'&'/" file.txt