所以我已经使用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
编辑:澄清输入/输出
答案 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/value3
,value1
,value2
和{ {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