我的目标是为文件中的每一行添加一个撇号,并跳过空行。
file.txt的:
Quote1
Quote2
Quote3
到目前为止我使用了sed:
sed -e "s/\(.*\)/'\1'/"
这项工作是什么,但也在空行中创建撇号:
'Quote1'
'Quote2'
''
'Quote3'
我的目标:
'Quote1'
'Quote2'
'Quote3'
我怎么能通过使用sed实现这一点,或者它应该是awk。
.*
意味着zero or more characters
,你想要1 or more characters
,在任何sed将是..*
:
$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
你也可以把这个regexp写成GNU sed中的.\+
,POSIX seds中的.\{1,\}
,以及用.+
调用的GNU或OSX / BSD中的-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'
$
单程:
awk '$1{$0 = q $0 q}1' q="'" file
仅当第一列($1
)具有某个值时才添加引号。 1
打印每一行。
假设您要将单引号添加到只包含空格的行:
sed -E "/./s/(.*)/'\1'/"
另一个sed
sed '/^$/!{s/^/\x27/;s/$/\x27/}' file
上面的剧本说
/^$/
- 模式。!
)的行,用单引号(^
)替换start($
)和end(\x27
)。您可以使用perl
检查负面的lookbehind,断言您将不匹配“空”行:
perl -pe 's/(?<!$)(.*)/"\1"/' file
正如@edmorton在他的回答中所建议的那样,另一种选择在你的正则表达式中更具体。
尝试过gnu sed
sed -E "s/\S+/'&'/" file.txt