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

Surround every line with single quote except empty lines

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

file.txt:

Quote1
Quote2

Quote3

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

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

执行此操作但也在空行中创建撇号:

'Quote1'
'Quote2'
''
'Quote3'

我的目标:

'Quote1'
'Quote2'

'Quote3'

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

一种方式:

awk '{[=10=] = q [=10=] q}1' q="'" file

仅当第 1 列 (</code>) 具有一定价值时才添加引号。 <code>1 打印每一行。

.* 表示 zero or more characters,您需要 1 or more characters,这在任何 sed 中都是 ..*:

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

'Quote3'

您也可以在 GNU sed 中将该正则表达式写为 .\+,在 POSIX seds 中写为 .\{1,\},在 GNU 中写为 .+ 或 OSX/BSD sed 时用 -E.

调用

以上假设所有空格的行都应该被引用。如果那是错误的那么:

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

'Quote3'

在任何 awk 中假设所有空格的行都应该被引用:

$ awk '/./{[=12=]="7" [=12=] "7"}1' file
'Quote1'
'Quote2'

'Quote3'

否则:

$ awk 'NF{[=13=]="7" [=13=] "7"}1' file
'Quote1'
'Quote2'

'Quote3'

你可以看到上面的区别:

$ printf '   \n' | sed "s/..*/'&'/"
'   '
$ printf '   \n' | sed "s/.*[^[:blank:]].*/'&'/"

$ printf '   \n' | awk '/./{[=14=]="7" [=14=] "7"}1'
'   '
$ printf '   \n' | awk 'NF{[=14=]="7" [=14=] "7"}1'

$

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

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

您可以使用 perl 来检查负向回顾,断言您不会匹配 "empty" 行:

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

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

另一个sed

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

上面的脚本说

  • 寻找空行 - /^$/ - 模式。
  • 对于那些不遵循上述模式的行(!),将开始(^)和结束($)替换为单引号(\x27).

尝试过 gnu sed

sed -E "s/\S+/'&'/" file.txt