您好我只是尝试使用简单的sed命令编写代码。 这是我的问题:
我想从文件中打印某些行,这些是条件:
- 只有该行至少有两个单词
- 只有第二个Word至少有3个字符
- 遵循上述条件后,必须定期打印线条,但线条中必须加倍前3个字符的第二个字除外。 修改
本部分可以在AWK中完成
- 在最后一行,它必须打印原始文件中没有包含的行数
示例:
abc2 1 def2 3 abc2
dea 123 123 zy45
12 12
abc cd abc cd
xyz%$@! x@yz%$@! kk
xyzxyz
abc htzw
输出:
dea 112233 123 zy45
xyz%$@! xx@@yyz%$@! kk
abc hhttzzw
4
这是我目前的代码:
sed -r '/[ ]*([^ ]+[ ]){2,}/!d' ex >| tmp
sed -r '/[ ]*[^ ]+[ ][^ ]{3,}/!d' tmp >| tmp2
sed -r 's/([ ]*[^ }+[ ])([^ ])([^ ])([^ ])(*)/\1 \2 \2 \3 \3 \4 \4 \5/' tmp2
>| tmp
但是我似乎遇到了一个我无法解决的错误,我无法弄清楚如何打印数字4(参见示例)。
错误:
sed: -e expression #1, char 62: Invalid preceding regular expression
任何帮助都会很棒:)
答案 0 :(得分:1)
你可以尝试这个(sed + bash)
nb=$(sed -n '$=' infile)
sed -E '
/([^ ]* )([^[:space:]]*)(.*)/h
s//\2/
tA
d
:A
s/([^[:space:]])([^[:space:]])([^[:space:]])(.*)/\1\1\2\2\3\3\4/
tB
d
:B
G
s/(.*)\n([^ ]* )([^[:space:]]*)(.*)/\2\1\4/
' infile > infilebis
cat infilebis
echo $(($nb - $(sed -n '$=' infilebis)))
rm infilebis
答案 1 :(得分:1)
您的任务的第一部分可以使用GNU sed
:
sed -rn 's/^([^ ]+ )([^ ])([^ ])([^ ])/\1\2\2\3\3\4\4/; T; p' input.txt
T标签 - 如果没有s ///已经成功替换,因为读取了最后一个输入行,从那以后 最后一个t或T命令,然后分支到标签;如果省略label,则跳转到脚本结尾。 这是一个GNU扩展。
<强>输出强>
dea 112233 123 zy45
xyz%$@! xx@@yyz%$@! kk
abc hhttzzw
#!/bin/bash
sed -rn '
s/^([^ ]+ )([^ ])([^ ])([^ ])/\1\2\2\3\3\4\4/
T branch
p; d
:branch
w not_included.txt
' input.txt
wc -l < not_included.txt
<强>输出强>
dea 112233 123 zy45
xyz%$@! xx@@yyz%$@! kk
abc hhttzzw
4
答案 2 :(得分:0)
sed -r '/^[ ]*[^ ]+[ ][^ ]+([ ]|$)/!d' ex >| tmp
sed -r '/^[ ]*[^ ]+[ ][^ ]+([ ]|$)/d' ex >| delete
sed -r '/^[ ]*[^ ]+[ ][^ ]{3,}/d' tmp >> delete
sed -r '/^[ ]*[^ ]+[ ][^ ]{3,}/!d' tmp >| yolo
sed -r 's/(^[ ]*[^ ]+[ ])([^ ])([^ ])([^ ])(.*)/\1\2\2\3\3\4\4\5/' yolo
sed -n '$=' delete