仅当使用sed

时间:2018-01-11 12:39:13

标签: regex string bash awk sed

我正在尝试添加名为" SPEC1"的字符串。到以BEGIN开头的行的末尾,但仅当该字符串不存在时才行。一些匹配的行可能已经或可能没有字符串。

我的示例文件如下所示:

BEGIN value1 value2 value3 SPEC1
some_other_line1
BEGIN value1 value2 value3 value4
some_other_line2
BEGIN value1 value2

结果应如下所示:

BEGIN value1 value2 value3 SPEC1
some_other_line1
BEGIN value1 value2 value3 value4 SPEC1
some_other_line2
BEGIN value1 value2 SPEC1

我正在使用 sed 来尝试实现这一目标。我目前的sed解决方案是这样的:

sed '/BEGIN/ {
s/ \+SPEC1//g
s|\(.*\)|\1 SPEC1|
}' file

上述说明:

  1. 搜索以" BEGIN"
  2. 开头的行
  3. 寻找现有字符串" SPEC1" (前面也可能有一个或多个空格)并全局删除它以清理文件
  4. 捕获整个匹配的行(sed BRE样式)并使用" SPEC1"
  5. 追加行

    使用sed,awk,perl还是bash有没有更好的方法来实现这一目标?

    感谢。

4 个答案:

答案 0 :(得分:2)

<?php if (isset($_POST['offset']) && isset ($_POST['limit']) && isset ($_POST['vegetables'])) { $limit = $_POST['limit']; $offset = $_POST['offset']; $more = $_POST['spices']; $data = mysqli_query ($con, "SELECT * FROM `products` WHERE category = '$more' LIMIT $limit OFFSET $offset"); while ($g = mysqli_fetch_array($data)){ $id = $g['id']; $product_name = $g['product_name']; $product_image = $g['product_image']; $product_price = $g['product_price']; ?> <?php } } ?> 解决方案:

Awk
  • awk '$1=="BEGIN" && $NF!="SPEC1"{ $(NF+1)="SPEC1" }1' file - 当前记录的第一个字段
  • $1 - 当前输入记录中的字段数(指向最后一个字段)
  • $NF - 为最后一个
  • 后的下一个字段生成值

输出:

$(NF+1)

答案 1 :(得分:1)

awk '/^BEGIN/&& !/SPEC1$/{$0=$0 FS "SPEC1"}1' inputfile
BEGIN value1 value2 value3 SPEC1
some_other_line1
BEGIN value1 value2 value3 value4 SPEC1
some_other_line2
BEGIN value1 value2 SPEC1

如果您希望将SPEC1作为变量:

awk -v string="SPEC1"$"" '/^BEGIN/&&  $0 !~ string{$0=$0 FS string}1' input

答案 2 :(得分:1)

改进OP中提到的sed版本

$ sed '/BEGIN/{/ SPEC1/! s/$/ SPEC1/}' ip.txt
BEGIN value1 value2 value3 SPEC1
some_other_line1
BEGIN value1 value2 value3 value4 SPEC1
some_other_line2
BEGIN value1 value2 SPEC1
  • /BEGIN/如果行包含BEGIN(如果需要,添加行限定符的开头)
    • / SPEC1/!如果行不包含SPEC1(如果需要,添加行尾限定符)
    • s/$/ SPEC1/SPEC1添加到行尾

答案 3 :(得分:0)

另一种可能的sed解决方案:

$ sed -r '/^BEGIN/s/( SPEC1)?$/ SPEC1/' data
BEGIN value1 value2 value3 SPEC1
some_other_line1
BEGIN value1 value2 value3 value4 SPEC1
some_other_line2
BEGIN value1 value2 SPEC1