awk或sed删除每行文件中x出现后的所有文本

时间:2018-06-08 17:16:56

标签: linux bash unix awk sed

所以我已经使用sed来清理某些关键字,例如,我使用awk删除?之后的所有内容。但我有一个看起来像这样的文件。

输入:

/value1/value2/value3/morestuff

期望的输出:

/value1/value2/value3

所有值都不是静态的,我只能键入斜杠。

我需要删除value3之后的所有内容。除了斜线数量之外什么都不是静止的。想法?

代码示例:

cat $FILE | awk '/User/ {print $7,$9,$13}' | awk  -F? '{print $1}' | sort --unique > $tempNAME
sed -i 's/with/ /g' $tempNAME
sed -i 's/trans.*se]//' $tempNAME
sed -i 's/trans.*st]//' $tempNAME

编辑:澄清输入/输出

4 个答案:

答案 0 :(得分:2)

编辑: 根据OP的评论现在编辑我的代码如下。

echo "/value1/value2/value3/value4/something/whatever" | awk -F"/" '{NF=4} 1' OFS="/"

由于您没有显示输入和输出的示例,因此根据您的声明,简单的awk可能会对您有帮助。

awk '{sub(/value3.*/,"value3")} 1' Input_file

答案 1 :(得分:1)

我假设您要求的是将/value1/value2/value3/anything替换为/value1/value2/value3value1value2和{ {1}}都是独立的,任意字符串,不包括斜杠。

由于斜杠数是静态的,因此value3就足够了:

sed

这从行的开头(sed "s:^/([^/]*)/([^/]*)/([^/]*)/.*$:/\1/\2/\3:" my_input_file )开始。然后它匹配斜杠(^),然后捕获(/)任何不包含斜杠((...))的字符串。它最后一次做了3次。然后它会将斜杠和剩余的任何字符([^/]*)匹配到行/.*的末尾。它将所有内容替换为以斜杠($)分隔的已捕获匹配项(\1\2\3)。

我使用冒号(/\1/\2/\3)作为搜索/替换分隔符而不是斜杠,以避免必须转义匹配/替换字符串中的斜杠。 :使用sed命令后面的第一个字符作为分隔符(请参阅How to replace strings containing slashes with sed)。

答案 2 :(得分:1)

使用bash,我们可以在斜杠上拆分字符串,然后用斜杠连接前4个元素:

$ str=/a/b/c/d/e/f/g/h
$ IFS=/ read -ra dirs <<<"$str"
$ (IFS=/; echo "${dirs[*]:0:4}")
/a/b/c

我们使用“4”,因为数组的第0个元素是前导斜杠之前的空字符串。

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's|/[^/]*||4g' file

删除/的第四次或更多次出现,后跟零或非/

替代方案:

sed 's/\(\(\/[^\/]*\)\{3\}\).*/\1/' file

在第三次出现/之后删除该行的其余部分,然后是零或非/

还有反斜杠:

sed -r 's#((/[^/]*){3}).*#\1#' file