除空行外,每行都用单引号引起来

And*_*eak 4 unix awk text-processing sed

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

file.txt

Quote1
Quote2

Quote3
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经使用sed:

sed -e "s/\(.*\)/'\1'/"
Run Code Online (Sandbox Code Playgroud)

哪个可以工作,但也会在空行中产生撇号:

'Quote1'
'Quote2'
''
'Quote3'
Run Code Online (Sandbox Code Playgroud)

我的目标:

'Quote1'
'Quote2'

'Quote3'
Run Code Online (Sandbox Code Playgroud)

我如何通过使用sed来实现这一目标,或者应该是awk。

Ed *_*ton 6

.*意味着zero or more characters,您希望1 or more characters在任何sed中将是..*

$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'

'Quote3'
Run Code Online (Sandbox Code Playgroud)

您还可以像.\+使用GNU sed,.\{1,\}POSIX sed 以及.+GNU或OSX / BSD sed 一样编写该regexp -E

以上假设所有空白行均应加引号。如果那是错误的,那么:

$ sed "s/.*[^[:blank:]].*/'&'/" file
'Quote1'
'Quote2'

'Quote3'
Run Code Online (Sandbox Code Playgroud)

在任何awk中,假定所有空白行均应加引号:

$ awk '/./{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'

'Quote3'
Run Code Online (Sandbox Code Playgroud)

除此以外:

$ awk 'NF{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'

'Quote3'
Run Code Online (Sandbox Code Playgroud)

您可以看到上面的区别:

$ 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'

$
Run Code Online (Sandbox Code Playgroud)