Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用sed或awk的行的单引号部分_Bash_Awk_Sed - Fatal编程技术网

Bash 使用sed或awk的行的单引号部分

Bash 使用sed或awk的行的单引号部分,bash,awk,sed,Bash,Awk,Sed,使用sed或awk按如下方式转换输入文本: awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file 输入文件: 113259740 QA Test in progress 219919630 UAT Test in progress 预期产出: 113259740 'QA Test in progress'

使用
sed
awk
按如下方式转换输入文本:

awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file
输入文件:

       113259740 QA Test in progress
       219919630 UAT Test in progress
预期产出:

       113259740 'QA Test in progress'
       219919630 'UAT Test in progress'

您可以通过利用bash等大多数shell中涉及的单词拆分来执行此操作。为了避免最终结果中出现额外的单引号,您可以使用sed将其删除。这也将修剪i之前、i和j之间以及j之后的任何额外空间

cat file.txt | sed“s/'//g”|同时读取i j;做回显“$i'$j'”;完成


在这里,我们将第一个单词导入变量i,其余的导入变量j。

您可以利用bash等大多数shell中涉及的单词拆分来执行此操作。为了避免最终结果中出现额外的单引号,您可以使用sed将其删除。这也将修剪i之前、i和j之间以及j之后的任何额外空间

cat file.txt | sed“s/'//g”|同时读取i j;做回显“$i'$j'”;完成


在这里,我们将使用GNU
sed
或BSD(OSX)
sed
将第一个单词导入变量i,其余单词导入j.

sed -E "s/^( *)([^ ]+)( +)(.*)$/\1\2\3'\4'/" file
  • ^(*)
    捕获所有前导空格(如果有)
  • ([^]+)
    捕获第一个字段(长度至少为1的一行非空格字符)
  • (+)
    捕获第一个字段后的空格
  • (.*)$
    匹配行的其余部分,不管它是什么
  • \1\2\3'\4'
    用捕获的前导空格替换每个(匹配的)输入行,后跟第一个字段,后跟捕获的第一个字段间空格,后跟输入行的单引号剩余部分。要放弃前导空格,只需省略
    \1
注:

  • 匹配第1个字段比严格要求更为宽松,因为它匹配任何非空格字符序列,而不仅仅是数字(如示例输入数据中所示)
  • 支持其他形式的空白(如制表符)的通用解决方案(包括第一个字段之后)如下所示:

    sed -E "s/^([[:space:]]*)([^[:space:]]+)([[:space:]]+)(.*)$/\1\2\3'\4'/" file
    

如果您的
sed
版本不支持
-E
(或
-r
)以启用对扩展正则表达式的支持,请尝试使用基本正则表达式的以下兼容POSIX的变体:


使用GNU
sed
或BSD(OSX)
sed

sed -E "s/^( *)([^ ]+)( +)(.*)$/\1\2\3'\4'/" file
  • ^(*)
    捕获所有前导空格(如果有)
  • ([^]+)
    捕获第一个字段(长度至少为1的一行非空格字符)
  • (+)
    捕获第一个字段后的空格
  • (.*)$
    匹配行的其余部分,不管它是什么
  • \1\2\3'\4'
    用捕获的前导空格替换每个(匹配的)输入行,后跟第一个字段,后跟捕获的第一个字段间空格,后跟输入行的单引号剩余部分。要放弃前导空格,只需省略
    \1
注:

  • 匹配第1个字段比严格要求更为宽松,因为它匹配任何非空格字符序列,而不仅仅是数字(如示例输入数据中所示)
  • 支持其他形式的空白(如制表符)的通用解决方案(包括第一个字段之后)如下所示:

    sed -E "s/^([[:space:]]*)([^[:space:]]+)([[:space:]]+)(.*)$/\1\2\3'\4'/" file
    

如果您的
sed
版本不支持
-E
(或
-r
)以启用对扩展正则表达式的支持,请尝试使用基本正则表达式的以下兼容POSIX的变体:


awk
中:

awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file

awk
中:

awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file

您也可以尝试这个GNU
sed
命令

sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" file
  • ^(+)
    ,在开始处捕获一个或多个空格并将其存储在组中(1)

  • ([0-9]+)
    -在开始时捕捉到一个或多个空格后,接下来它将匹配其后的一个空格,并获取该空格旁边的所有数字,然后将其存储在一个组中(2)

  • (.*)$
    -获取数字旁边直到最后一个字符的所有字符,然后将其存储在一个组(3)中

  • 根据所需的输出,在替换部件中重新排列所有提取的组

示例:

$ cat ccc
       113259740 QA Test in progress
       219919630 UAT Test in progress

$ sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" ccc
       113259740 'QA Test in progress'
       219919630 'UAT Test in progress'

您也可以尝试这个GNU
sed
命令

sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" file
  • ^(+)
    ,在开始处捕获一个或多个空格并将其存储在组中(1)

  • ([0-9]+)
    -在开始时捕捉到一个或多个空格后,接下来它将匹配其后的一个空格,并获取该空格旁边的所有数字,然后将其存储在一个组中(2)

  • (.*)$
    -获取数字旁边直到最后一个字符的所有字符,然后将其存储在一个组(3)中

  • 根据所需的输出,在替换部件中重新排列所有提取的组

示例:

$ cat ccc
       113259740 QA Test in progress
       219919630 UAT Test in progress

$ sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" ccc
       113259740 'QA Test in progress'
       219919630 'UAT Test in progress'

awk
解决方案:

awk -v q="'" '{ f1=$1; $1=""; print f1, q substr($0,2) q }' file
  • 允许
    awk
    按空格将每个输入行拆分为字段(默认行为)
  • -v q=“”
    定义了包含单引号的awk变量
    q
    ,以便更容易在作为一个整体的单引号的awk程序中使用单引号
  • f1=$1
    保存第一个字段供以后使用
  • $1==”
    有效地删除了输入行中的第一个字段,留下最初引用整个输入行的
    $0
    ,其中包含一个空格,后跟行的其余部分(严格来说,使用输出字段分隔符OFS重新连接字段,该分隔符默认为空格;由于第一个字段现在为空,因此生成的
    $0
    以一个空格开始,后面是所有剩余字段,每个字段用空格分隔)
  • 打印f1,q substr($0,2)q
    然后打印保存的第一个字段,后跟一个空格(
    OFS