我正在尝试添加名为" 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
上述说明:
使用sed,awk,perl还是bash有没有更好的方法来实现这一目标?
感谢。
答案 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