除了空行外,用单引号包围每一行

问题描述 投票:4回答:6

我的目标是为文件中的每一行添加一个撇号,并跳过空行。

file.txt的:

Quote1
Quote2

Quote3

到目前为止我使用了sed:

sed -e "s/\(.*\)/'\1'/"

这项工作是什么,但也在空行中创建撇号:

'Quote1'
'Quote2'
''
'Quote3'

我的目标:

'Quote1'
'Quote2'

'Quote3'

我怎么能通过使用sed实现这一点,或者它应该是awk。

unix awk sed text-processing
6个回答
6
投票

.*意味着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'

$

1
投票

单程:

awk '$1{$0 = q $0 q}1' q="'" file

仅当第一列($1)具有某个值时才添加引号。 1打印每一行。


1
投票

假设您要将单引号添加到只包含空格的行:

sed -E "/./s/(.*)/'\1'/"

1
投票

另一个sed

sed '/^$/!{s/^/\x27/;s/$/\x27/}' file

上面的剧本说

  • 寻找一条空行 - /^$/ - 模式。
  • 对于那些不遵循上述模式(!)的行,用单引号(^)替换start($)和end(\x27)。

0
投票

您可以使用perl检查负面的lookbehind,断言您将不匹配“空”行:

perl -pe 's/(?<!$)(.*)/"\1"/' file

正如@edmorton在他的回答中所建议的那样,另一种选择在你的正则表达式中更具体。


0
投票

尝试过gnu sed

sed -E "s/\S+/'&'/" file.txt
© www.soinside.com 2019 - 2024. All rights reserved.